ich möchte direkt loslegen und werde das Ganze mal auf ein einfaches Beispiel runterbrechen:
Angenommen ich habe ein Interface Shape und davon abgeleitet Klassen wie Polygon, Circle, Rectangle,...
Code: Alles auswählen
Shape
|--Polygon
|--Circle
|--Rectangle
Zugriffe auf Methoden müssen immer sowohl für das Shape als auch für seinen Puffer erfolgen, da kein Aktualisieren des Puffers durch Kopieren erfolgt, sondern lediglich die Zeiger getauscht werden.
Die Shapes an sich sollen unverändert bleiben (zwischenzeitlich hatten sie jeweils einen Pointer auf ihren Puffer -- unschön), sämtliche zusätzliche Funktionalität soll von außen, vom DoubleBufferedShape kommen. Das ließe sich zunächst über (rein) virtuelle Methoden setAttribute machen, z.B.:
Code: Alles auswählen
DoubleBufferedShapeDerived::setAttribute(Attribute Attr)
{
m_Shape->setAttribute(Attr);
m_Buffer->setAttribute(Attr);
}
Code: Alles auswählen
DoubleBufferedShape.registerMethod("Circle::setRadius"); // Die Doppelpunktsyntax ist hier nur sinngemäß
Code: Alles auswählen
DoubleBufferedShape.set("Radius", 5); // Syntax wiederum nur sinngemäß/repräsentativ
Ich hoffe das Problem ist einigermaßen klar geworden, vielleicht ist das grundsätzliche Design, ein Interface in dieser Form zu kapseln schon wenig elegant?! Die zu setzenden Attribute sind bekannt, werden die Methoden nicht schon rein virtuell vorgehalten entsteht intern natürlich ein nicht ganz so hübsches
Code: Alles auswählen
static_cast<Circle*>(pShape)->setRadius(fRad);
Edit: Lösung:
DoubleBufferedShape führt über getFront() und getBack() beispielsweise die Pointer zu den Shapes nach außen, dort können sie nach Belieben modifiziert werden. Das war schon vorher der Fall, allerdings war die Information dann nicht im jeweiligen Puffer vorhanden. Für den Fall (der Normalfall, wenn man nicht weiß, was man tut), dass sämtliche Informationen zum Puffer kopiert werden sollen, wird getShape() aufgerufen. Diese Methode liefert auch einen Zeiger auf das aktuelle Shape. Allerdings geschieht dies über die lokale Instanz einer Helferklasse, bei deren Destruktoraufruf die Information zum Puffer kopiert wird.