Cloning...?!

Hallo Gurus,

ich mache gerade einen C/C++ Kurs, ziemlich heavy :wink:
Jetzt arbeite ich gerade ein Übungsbeispiel durch, in dem eine abstrakte Basisklasse ‚GraphObject‘ definiert wird. Und da heisst es dann in der Headerdatei:
…
virtual GraphObject *Clone() const = 0;
…

hä? kann mir das jemand auf deutsch erkären, was da geschieht?
Naja - eig. ist es ja eine rein virtuelle Methode, d.h. es geschieht nichts. In einem abgeleiteten Object ‚Rectangle‘ aber dann:
…
virtual GraphObject *Clone();
…

GraphObject *Rectangle::Clone() const
{
return new Rectangle(*this);
}

???
Danke schon mal!
Christof

Hallo Gurus,

Hi Christof,

bin zwar kein Guru, aber vielleicht kann ich dir ja dennoch helfen. Mal schauen.

virtual GraphObject *Clone() const = 0;

Da wird eine virtuelle Methode namens „Clone“ definiert, die einen pointer auf ein Objekt vom Typ „GraphicObject“ zurückliefert und die das Ursprungsobjekt (in dem sie aufgerufen wird) nicht verändert. Da diese Methode rein virtuell ist, wird sie mit 0 belegt. Und ja, es geschieht hier in der Tat nichts! :wink:

virtual GraphObject *Clone();
…

GraphObject *Rectangle::Clone() const
{
return new Rectangle(*this);
}

Rechtangle ist eine von GraphObject abgeleitete Klasse, oder anders ausgedrückt, ein Rectangle ist ein GraphObject, allerdings in diesem Falle ein konkretes. Hier wird dann die in GraphObject noch virtuelle Methode „Clone“ (du hast oben vermutlich das const vergessen?) konkretisiert, d.h. implementiert. Das „virtual“ hier heißt nichts anderes, als daß eine von Rectangle abgeleitete Klasse diese Methode ihrerseits neu implementieren kann, aber das kann man glaube ich auch weglassen, da eine Methode immer virtuell ist, wenn sie’s einmal war (kann aber auch sein, daß ich mich hier irre).

Jedenfalls macht die Methode folgendes: Nehme den Pointer auf das aktuelle Objekt (this), dereferenziere ihn (*this), d.h. *this ist dann das aktuelle Objekt. Dann wird der sog. „Copy Constructor“ der Klasse Rectangle aufgerufen. Der macht nichts anderes als eine Kopie aller Attribute des alten Objekts anzufertigen und daraus ein neues Objekt der gleichen Klasse zu bauen. Das ganze wurde mit „new“ aufgerufen, also gibt’s einen Pointer auf das neue Objekt zurück.

Ich hoffe, das schafft etwas Klarheit?

Chris

Hi Chris,

virtual GraphObject *Clone() const = 0;

Da wird eine virtuelle Methode namens „Clone“ definiert, die
einen pointer auf ein Objekt vom Typ „GraphicObject“
zurückliefert und die das Ursprungsobjekt (in dem sie
aufgerufen wird) nicht verändert. Da diese Methode rein

eine ReadOnly-Methode also, dafür das ‚const‘ - klar.

virtuell ist, wird sie mit 0 belegt. Und ja, es geschieht hier
in der Tat nichts! :wink:

virtual GraphObject *Clone();
…

GraphObject *Rectangle::Clone() const
{
return new Rectangle(*this);
}

Rechtangle ist eine von GraphObject abgeleitete Klasse, oder
anders ausgedrückt, ein Rectangle ist ein GraphObject,
allerdings in diesem Falle ein konkretes. Hier wird dann die
in GraphObject noch virtuelle Methode „Clone“ (du hast oben
vermutlich das const vergessen?) konkretisiert, d.h.

beim Prototyp - ja, hatte ich vergessen.

implementiert. Das „virtual“ hier heißt nichts anderes, als
daß eine von Rectangle abgeleitete Klasse diese Methode
ihrerseits neu implementieren kann, aber das kann man glaube
ich auch weglassen, da eine Methode immer virtuell ist, wenn
sie’s einmal war (kann aber auch sein, daß ich mich hier
irre).

das ist, so - habe wir auch gehört. Für den Stil/Lesbarkeit ist es aber besser, es hinzuschreiben.

Jedenfalls macht die Methode folgendes: Nehme den Pointer auf
das aktuelle Objekt (this), dereferenziere ihn (*this), d.h.
*this ist dann das aktuelle Objekt. Dann wird der sog. „Copy
Constructor“ der Klasse Rectangle aufgerufen. Der macht nichts
anderes als eine Kopie aller Attribute des alten Objekts
anzufertigen und daraus ein neues Objekt der gleichen Klasse
zu bauen. Das ganze wurde mit „new“ aufgerufen, also gibt’s
einen Pointer auf das neue Objekt zurück.

Ich hoffe, das schafft etwas Klarheit?

ok - ich denke schon.
Mit eigenen Worten: Mit new wird ein neues Objekt rectangle erstellt, und als Parameter wird dafür das eigene Objekt (per Pointer) übergeben. Also eine Kopie von sich selbst (Clone…!) erstellt. Steil!

Danke schön für die Mühe!
Christof

Hi Christof,

Mit eigenen Worten: Mit new wird ein neues Objekt rectangle
erstellt, und als Parameter wird dafür das eigene Objekt (per
Pointer) übergeben. Also eine Kopie von sich selbst
(Clone…!) erstellt. Steil!

Ich will ja jetzt nicht übermäßig pedantisch sein, aber das Argument der Methode ist kein Zeiger auf das Objekt (das wäre this), sondern das Objekt selber (*this).

Chris

Hi Christof,

Mit eigenen Worten: Mit new wird ein neues Objekt rectangle
erstellt, und als Parameter wird dafür das eigene Objekt (per
Pointer) übergeben. Also eine Kopie von sich selbst
(Clone…!) erstellt. Steil!

Ich will ja jetzt nicht übermäßig pedantisch sein, aber das
Argument der Methode ist kein Zeiger auf das Objekt (das wäre
this), sondern das Objekt selber (*this).

ja, klar - diese „Pedanterie“ ist ja auch wirklich nötig!

Danke nochmals,
Christof