基于C ++ Components的类

时间:2012-07-17 15:53:11

标签: c++

您好,

我正在用容器编写一个基于组件的类,但在考虑了许多不同的方法之后,我找不到真正遵循我想要的方法。

以下是一般概念的示例:

http://imageshack.us/photo/my-images/713/38394964.png/


我已写的代码:

// 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”,这是抽象的。我很确定有一种更好(更简单?)的方式可以做到这一点,但我没有想法。

1 个答案:

答案 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?