Problem mit Composite Pattern

Alex_T

Erfahrenes Mitglied
Hallöle,

nach langer Zeit muss ich mal wieder eine Frage loswerden.
Wie es der Titel schon sagt, habe ich ein Problem mit dem Composite Pattern. Doch bevor wir hier viel rumquatschen, der entsprechende Code:

C++:
/*
*	Composite Pattern - Example
*/

/* REQUIRED INCLUDES */
#include <iostream>
#include <string>
#include <vector>

using namespace std;

/* COMPONENT-CLASS */
class Component {
public:
	virtual ~Component();
	virtual void add(Component*) {};
	virtual string getName(void) = 0;	
};

/* LEAF-CLASS */
class Leaf : public Component {
public:
	Leaf(string name):name_(name){};
	~Leaf(){};

	virtual string getName(void) {
		return this->name_;
	}

private:
	string name_;
};

/* COMPOSITE-CLASS */
class Composite : public Component {
public:
	Composite(string name):name_(name){};
	~Composite(){};

	virtual void add(Component* aComponent) {
		this->children_.push_back(aComponent);
	}

	virtual string getName(void) {
		return this->name_;
	}
private:
	string name_;
	vector<Component*> children_;
};




int main() {
	// CREATE INSTANCES
	Composite c1("test");
	Composite c2("test2");
	
	Leaf l1("Leaf 1");

	c1.add(l1);	// <-- das will er nicht...

	cout << "Test des Compostite Patterns" << endl;

	return 0;
}

Ich hatte das Ganze schon in verschiedene Header-Files aufgesplittet, aber das würde hier zu unübersichtlich sein.
Deshalb eine kurze Erklärung dazu:

Die Klasse Component soll ein Interface darstellen. Nun habe ich noch eine Klasse Leaf, die das Ende einer Baumstruktur darstellen soll (man kann dieser Komponente also keine weiteren hinzufügen).
Anders ist es bei der Composite - diese stellt einen weiteren Knoten im Baum dar.

Nun gehe ich von folgendem Sachverhalt aus:
Ich vererbe die abstrakte Klasse / das Interface Component, weshalb ich in der Lage sein müsste, die Zeile "c1.add(l1);" ausführen zu können, da ja alles vom gleichen TYP ist (nämlich Component).
Visual Studio meint aber, dass die Konvertierung nach Component nicht möglich ist.

Liegt da ein Denkfehler vor?
Ich wäre über jede Hilfe dankbar.

Gruß Alex

P.S. ich habe mal noch ein allgemeines Klassendiagramm für das Pattern in den Anhang gepackt.
 

Anhänge

  • Klassendiagramm_Composite.jpg
    Klassendiagramm_Composite.jpg
    25,3 KB · Aufrufe: 13
l1 ist ein Leaf, das kann nicht zu Component* konvertiert werden. Wenn, dann müsstest du &l1 verwenden, oder die add-Methode müsste eine Referenz entgegen nehmen.
 
Danke für deine Antwort. Manchmal sollte man den Wald einfach abholzen - dann steht nur noch ein Baum, den man dann nicht mehr übersehen kann.

Ich war hier vom new-Operator ausgegangen, den ich nicht genutzt habe.
Damit hätte es dann in der oben beschriebenen Variante funktioniert.

C++:
int main() {
	// CREATE INSTANCES
	Composite c1("test");
	Composite* c2 = new Composite("test2");

	Leaf l1("Leaf 1");
	Leaf* l2 = new Leaf("Leaf 2");

	c1.add(&l1);
	c2->add(l2);		// <-- das ist dann möglich (so, wie ich das wollte)

        return 0;
}

Also nochmals vielen Dank und noch einen schönen Abend.
 
Zurück