Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekte kopieren in Vererbungshierarchie

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
11.01.2008, 16:26 Uhr
~JoKl
Gast


Hallo zusammen,
ich habe das folgende Problem: Seien zwei Klassen A und B gegeben, wobei B von A abgeleitet ist.

C++:
class A{
...
}

class B : public A{
...
}



An einer Stelle im Programmfluss habe ich nun einen Zeiger auf ein Objekt vom Typ A, wobei es möglich ist, dass auf Objekte vom Typ B dort referenziert werden.


C++:
A* myPointer = new B();
A* myPointer2 = <Kopie vom myPointer-Objekt>



Wie kann ich jetzt das Objekt, auf das dieser Pointer zeigt kopieren? Wenn myPointer auf ein B-Objekt zeigt, dann soll auch myPointer2 auf ein B-Objekt zeigen.

Besten Dank
JoKl
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.01.2008, 16:52 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Indem du deiner Klasse einen Kopierkonstruktor hinzufügst und dann für myPointer2 eine neue Instanz erzeugst wobei du myPointer übergibst...
Dieser Post wurde am 11.01.2008 um 16:52 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.01.2008, 17:04 Uhr
~JoKl
Gast


Hi,
verstehe ich es richtig, dass ich der Klasse A einen CopyConstructor

C++:
A(const B& otherClass);


hinzufügen muss? Aber wie muss ich den schreiben, damit hier wirklich ein Objekt vom Typ B erzeugt wird?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.01.2008, 18:38 Uhr
0xdeadbeef
Gott
(Operator)


Ne, Guybrush hat sich da nur verdacht. Was du da vorhast ist keine saubere Sache, du willst evtl. dein Design an der Stelle überdenken - Prinzipiell gibst du, wenn du ein B-Objekt in einem A-Zeiger speicherst, alles Wissen darüber auf, dass es sich um ein B-Objekt handelt - wenn du wüsstest, dass der Zeiger auf ein B-Objekt zeigt, warum überhaupt einen A-Zeiger benutzen?

Es ist allerdings möglich (wenn auch nicht wirklich empfehlenswert), das mit dynamic_cast zu umschiffen, also

C++:
A *myPointer2;
B *tmp = dynamic_cast<B*>(myPointer);
if(tmp != NULL) {
  myPointer2 = new B(*tmp);
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 11.01.2008 um 18:38 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.01.2008, 00:22 Uhr
~JoKl
Gast


Ok, ich versuche es nochmal zu motivieren. Hierzu ein Beispiel, wie die Klassen genauer belegt sein können.


C++:
class Mensch{...};

class Lehrer : public Mensch{...};

class Schueler : public Mensch{...};



Jetzt habe ich eine Liste von Menschen die ich kenne

C++:
std::vector<Mensch*> freunde;



In diese Liste können nun eine Reihe von Menschen-, Lehrer- und Schüler-Objekten eingefügt werden.

C++:
freunde.push_back(new Lehrer(...));
freunde.push_back(new Schueler(...));
freunde.push_back(new Mensch(...));
...



Jetzt komme ich an eine Stelle, wo ich gerne ein Objekt dieser Freundeliste so wie es ist kopieren möchte.

C++:
Mensch* kopieEinesMenschen = <Kopie von> freunde.at(1);



Wie schaffe ich es, dass das Objekt auf das der Zeiger "kopieEinesMenschen" zeigt in diesem Fall wirklich ein "Schueler"-Objekt mit dem gleichen Inhalt wie das Element der Liste ist.

Ich hoffe, mein Problem ist jetzt verständlich. Ich finde diese Struktur eigentlich schon sauber um im Sinne der OOP und Vererbung ganz schön.

Viele Dank für eure Hilfe
JoKl
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.01.2008, 01:26 Uhr
0xdeadbeef
Gott
(Operator)


Gib Mensch eine virtuelle clone() const-Funktion, die das macht. Also

C++:
class Mensch {
public:
  virtual Mensch *clone() const { return new Mensch(*this); }
};

class Lehrer : public Mensch {
  virtual Mensch *clone() const { return new Lehrer(*this); }
};


usw.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.01.2008, 18:05 Uhr
~Jokl
Gast


Vielen Dank! Ich glaub das ist genau das, was ich gesucht habe.

Daraus folgt dann für mein Problem der folgende Aufruf, oder?

C++:
Mensch* kopieEinesMenschen = freunde.at(1).clone();

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.01.2008, 18:30 Uhr
0xdeadbeef
Gott
(Operator)


Genau.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: