Das hier funktioniert (deine Art einzurücken ist GRAUENHAFT!)
Code:
#include <iostream>
using namespace std;
class person
{
private:
char name[30];
int alter;
char ort[50];
public:
void erzeuge(const char* n = "Waise", unsigned int a = 0, const char* ort = "nirgends");
void ausgeben(void);
};
int main(void)
{
person mensch;
int wahl;
auswahl:
cout << "Personenverwaltung - 0.1\n";
cout << "Was moechten sie tun?\n";
cout << "1) Anzeigen 2) Erzeugen\n";
cin >> wahl;
switch (wahl)
{
case 1:
mensch.ausgeben();
break;
case 2:
mensch.erzeuge("Tom", 8, "Pimmelhausen");
system("cls");
cout << "Tom wurde erzeugt\n";
goto auswahl;
}
system("PAUSE");
}
void person::erzeuge(const char* n, unsigned int a,const char* ort)
{
strncpy(name, n, sizeof(name) - 1);
// durch die gleiche Benennung des Klassen-Attributes und des
// Parameters entsteht eine Namenskollision.
// Wir arbeiten mit dem this-Zeiger um das Klassen-Attribut
// ansprechen zu können.
strncpy(this->ort, ort, sizeof(this->ort) - 1);
// nicht notwendig:
//name[sizeof(name)] = '\0';
alter = a;
}
void person::ausgeben ( void )
{
cout << name << " " << alter << " Jahre (";
cout << "Wohnort : " << ort << ")\n";
}
Der Fehler von AlterHacker liegt hier:
strncpy(this->ort, ort, sizeof(ort)-1);
ort ist hier ein Zeiger auf einen char.
Der Zeiger an sich ist 4 Byte groß.
Daraus folgt:
strncpy(this->ort, ort, 4-1);
strncpy(this->ort, ort, 3);
Ansonsten:
this->ort[sizeof(ort)] = 0;
auch hier feht wieder das this-> vor dem rot markieren ort.
Außerdem wird das setzen eines 0-Bytes bereits von strncpy erledigt.
Diese Code-Zeile ist somit redundant.
mfG. BlackBerry