Programmieren - alles kontrollieren 4.934 Themen, 20.613 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
vergisses Yves3 „c++: frage zu arrays“
Optionen

Hi Yves3,

Die Zuweisung
Family[i] = *pCat;
ist bedenklich, da dort die Speicheradresse,
auf die *pCat zeigt, kopiert wird und in der Folgezeile
das *pCat Objekt wieder gelöscht wird.
Somit verwendet Family[i] eine nicht mehr
allozierte Speicherfläche, und auf die vorher
von Family[i] verwendete Speicherfläche
kann nicht mehr zugegriffen werden.
Dieser Fehler wird wahrscheinlich nicht vom Compiler erkannt,
sondern führt evtl. zu Laufzeitfehlern (Segment Verletzung).

Richtig wäre hier eine Operation, die letzten Endes
die einzelnen Membervariablen itsAge und itsWeight
einzeln kopiert. Die Implementierung könnte durch
durch entsprechende Memberfunktionen wie z. B. getAge/setAge
oder durch Überladung des Zuweisungsoperators = erfolgen.


Gruss, vergisses

bei Antwort benachrichtigen
Kleine Ergänzung Yves3
Kleine Ergänzung mr.escape
Kleine Ergänzung Yves3
Kleine Ergänzung vergisses
Kleine Ergänzung mr.escape
Kleine Ergänzung vergisses
Kleine Ergänzung mr.escape
Kleine Ergänzung vergisses