PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe bei Klassenprogramm



sp33dwalker
25.05.2009, 14:36
Hey,
Ich mache gerade eine Übungsaufgabe in C++.Bin schon fast fertig jedoch hab ich da ein kleines Problem.

Den Namen kopiere ich mit strncpy, jedoch weiss ich jetzt nicht wie ich noch den Wohnort in den Speicher kopiere.Habs mit noch einem strncpy versucht funzt aber nicht.Hier der code:


#include <iostream>

using namespace std;

class person {
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 );
name[sizeof(name)] = '\0';

alter = a;

}

void person::ausgeben ( void ) {
cout << name << " " << alter << " Jahre (";
cout << "Wohnort : " << ort;


}

AlterHacker
25.05.2009, 15:28
"Habs mit noch einem strncpy versucht funzt aber nicht."

Was funzt daran nicht?

sp33dwalker
25.05.2009, 15:36
strncpy
( ort, ort, sizeof(ort)-1 );
ort[sizeof(ort)] = '\0';


ich habs so probiert ,bekomm danach aber 4 errors

AlterHacker
25.05.2009, 16:08
strncpy(this->ort, ort, sizeof(ort)-1);
this->ort[sizeof(ort)] = 0;

Das schon versucht? (this->)


EDIT:
Und "Ich bekomme dann 4 errors, wie wäre es wenn du uns die mal hier genauer darstellst?

sp33dwalker
25.05.2009, 16:39
das funzt jedoch zeigt er mir dann bei wohnort nur "Pim" an

blackberry
25.05.2009, 17:27
Das hier funktioniert (deine Art einzurücken ist GRAUENHAFT!)


#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

sp33dwalker
25.05.2009, 18:49
Vielen Dank an alle :)

c4pone
27.05.2009, 22:44
an deiner stelle würde ich einen konstruktor schreiben der den variablen einen default wert zuweist und vielleicht solltest du dir auch ma den this-> pointer anschauhn

gruß c4pone