Hi,
I am writing a component-based class with a container, but having thought of many different approaches, I cannot find the one that follows what I want.
Here is an example of a general idea:

And the code that I already wrote:
// Abstract class Component class Component { public : virtual ~Component() = 0; virtual int GetResult() = 0; }; class AddComponent : Component { public : int GetResult() { return input1->GetResult() + input2->GetResult(); } void SetInput1(Component* c) { input1 = c; } void SetInput2(Component* c) { input2 = c; } private : Component* input1; Component* input2; }; class ConstComponent : Component { public : int GetResult() { return value; } void SetValue(int x) { value = x; } private : int value; }; class SignComponent : Component { public : int GetResult() { return sign(input->GetResult()); } void SetInput(Component* c) { input = c; } private : Component* input; }; class Container { public : Container(); ~Container(); void SetRootComponent(Component* c) { rootComponent = c; } int GetResult() { return rootComponent->GetResult(); } AddComponent* AddComponentAdd(); ConstComponent* ConstComponentAdd(); SignComponent* SignComponentAdd(); private : Component* rootComponent; std::vector<Component*> components; }; void main(void) { // Create container Container container = Container(); // Create components SignComponent* cSign = container.AddComponentSign(); AddComponent* cAdd = container.AddComponentAdd(); ConstComponent* cConst1 = container.AddComponentConst(); ConstComponent* cConst2 = container.AddComponentConst(); // Link components cSign->SetInput(cAdd); cAdd->SetInput1(cConst1); cAdd->SetInput2(cConst2); cConst1->SetValue(-5); cConst2->SetValue(3); // Set root component for container container.SetRootComponent(cSign); // Compute int result = container.GetResult(); }
This does not even compile due to casting "XComponent" to "Component", which is abstract. I'm pretty sure that there is a much better (and simpler?) Way to do this anyway, but I have no ideas.
source share