4

你好,

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

这是一般想法的示例:

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”,这是抽象的。我很确定无论如何都有更好(更简单?)的方法来做到这一点,但我没有想法。

4

1 回答 1

3

的默认继承classprivate

class ConstComponent : Component

对于Component您需要public继承的所有子类:

class ConstComponent : public Component

如果您试图将new子类的实例插入std::vector<Component*>(我认为您是)。 private继承不是is-a关系,而是has-a关系。请参阅“私有继承”和“组合”有何相似之处?.

于 2012-07-17T16:00:51.997 回答