Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

c++: frage zu arrays

Yves3 / 11 Antworten / Flachansicht Nickles

hallo


ich hab mal wieder eine frage zu c++ ;-) der erste quellcode ist aus meinem programmierbuch. warum wird dort der zeiger "pCat" verwendet? was ist an meiner lösung(source 2) anders? warum wurde das im buch nicht so gelöst?


danke für alle antworten!


<b>source 1:</b>


#include <iostream.h>


class CAT
{
public:
 CAT() { itsAge = 1; itsWeight = 5; }
 ~CAT();
 int GetAge() const { return itsAge; }
 int GetWeight() const { return itsWeight; }
 void SetAge(int age) { itsAge = age; }


private:
 int itsAge;
 int itsWeight;
};


CAT::~CAT()
{
// cout << "Destruktor aufgerufen!\n";
}


int main()
{
 CAT * Family = new CAT[500];
 int i;
 CAT * pCat;
 <b> 


for(i = 0; i<500 ; i++)
 {
  pCat = new CAT;
  pCat->SetAge(2*i +1);
  Family[i] = *pCat;
  delete pCat;
 }</b>


 for(i = 0; i<500; i++)
  cout << "Katze#" << (i+1) << ": " << Family[i].GetAge() << endl;


 delete [] Family;


 return 0;
}


<b>source 2</b>


#include <iostream.h>


class CAT
{
public:
 CAT() { itsAge = 1; itsWeight = 5; }
 ~CAT();
 int GetAge() const { return itsAge; }
 int GetWeight() const { return itsWeight; }
 void SetAge(int age) { itsAge = age; }


private:
 int itsAge;
 int itsWeight;
};


CAT::~CAT()
{
// cout << "Destruktor aufgerufen!\n";
}


int main()
{
 CAT * Family = new CAT[500];
 int i;
 <b>
 for(i = 0; i<500 ; i++)
 {


  Family[i].SetAge(2*i +1);


 }</b>


 for(i = 0; i<500; i++)
  cout << "Katze#" << (i+1) << ": " << Family[i].GetAge() << endl;


 delete [] Family;


 return 0;
}

bei Antwort benachrichtigen
Kleine Ergänzung vergisses
Kleine Ergänzung Yves3
Kleine Ergänzung mr.escape
Kleine Ergänzung Yves3
Kleine Ergänzung vergisses
mr.escape vergisses „Kleine Ergänzung“
Optionen
Objekte sind doch zusammengesetzte Datentypen und
Objektvariable letzlich ein Zeiger auf den Beginn
der vom Objekt belegten Speicherfläche.
Wenn ich Datenstrukturen kopieren will, kann ich das
doch auch nicht durch eine einfache Zuweisung tun,
sondern muss jede Membervariable einzeln kopieren, oder ?

Das macht normalerweise der kopier-operator, der einfach den speicher brutal kopiert. Damit werden auch die zeiger kopiert und zeigen dann auf die selbe adresse. Das kann gewollt sein, muss aber nicht immer gutgehen! Wenn man einen eigenen kopier-operator definiert, hat man alle aspekte unter kontrolle. Sind keine zeiger in der struktur, reicht aber der einfach (default) memcopy. Ein guter compiler sollte aber bei fehlendem kopier-operator UND zeigern in der struktur warnen (VC6 warnt natürlich nicht! VC7 soll aber angeblich deutlich strenger sein).

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Kleine Ergänzung vergisses
Kleine Ergänzung mr.escape
Kleine Ergänzung vergisses