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

のデフォルトの継承classは次のprivateとおりです。

class ConstComponent : Component

すべてのサブクラスについて、継承Componentが必要です。public

class ConstComponent : public Component

newサブクラスのインスタンスをstd::vector<Component*>(私が思うに)に挿入しようとしている場合。 private継承はis-a関係ではなく、has-a関係です。「私的継承」と「構成」はどのように似ていますか?を参照してください。。

于 2012-07-17T16:00:51.997 に答える