您好,
我正在用容器编写一个基于组件的类,但在考虑了许多不同的方法之后,我找不到真正遵循我想要的方法。
以下是一般概念的示例:
我已写的代码:
// 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();
}
这甚至都没有编译,因为“XComponent”转换为“Component”,这是抽象的。我很确定有一种更好(更简单?)的方式可以做到这一点,但我没有想法。
答案 0 :(得分:3)
class
的默认继承是private
:
class ConstComponent : Component
对于Component
的所有子类,您需要public
继承:
class ConstComponent : public Component
如果您尝试将new
子类的实例插入std::vector<Component*>
(我认为您)。
private
继承不是is-a
关系,而是has-a
关系。请参阅How are "private inheritance" and "composition" similar? 。