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:
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.
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.