1

ブースト ファクトリを使用して製品を作成します。私がやりたいのは、その に対して異なる製品を呼び出すことですDoSomething()が、問題は、すべての製品の戻り値が異なり、それらがすべて構造体であることです。ProductA->DoSomething() が必要な場合、その戻り値は structA になり、ProductB->DoSomething() の場合、その戻り値は strucB になります。また、すべての構造物がベースから駆動されますstructが、可能ですか? あなたの解決策をありがとう、本当に感謝します!

4

2 に答える 2

1

struct ReturnType基本メソッドと変数を定義するbase を宣言できます。その後、問題なく製品を作成できます。

struct ReturnType
{
    virtual std::string getName(){}
};
struct MarsType : ReturnType 
{
    std::string specialMethod()
    {
        return "MARS";
    }
};
struct SnikersType : ReturnType 
{
    std::string specialMethod2()
    {
        return "SNIKERS";
    }
};

class Product
{
    public:
        virtual ReturnType* doSomething()=0;
};

class SnikersProduct : public Product
{
public:
    ReturnType* doSomething()
    {
        return static_cast<ReturnType*>(&value);
    }
private:
    SnikersType value;
};

class MarsProduct : public Product
{
public:
    ReturnType* doSomething()
    {
        return static_cast<ReturnType*>(&value);
    }
private:
    MarsType value;
};

class Creator
{
public:
    virtual Product* createProduct()=0;
};


class SnikersCreator : public Creator
{
public:
    Product* createProduct()
    {
        return new SnikersProduct();
    }
};

class MarsCreator : public Creator
{
public:
    Product* createProduct()
    {
        return new MarsProduct();
    }
};

int main()
{
    std::vector<Creator*> creators;
    creators.push_back(new MarsCreator());
    creators.push_back(new SnikersCreator());
    Product* mars = creators[0]->createProduct();
    Product* snikers = creators[1]->createProduct();
    std::cout<<"mars product returns "<<dynamic_cast<MarsType*>(mars->doSomething())->specialMethod()<<std::endl;
    std::cout<<"snikers product returns "<<dynamic_cast<SnikersType*>(mars->doSomething())->specialMethod2()<<std::endl;
    return 0;
}

出力は次のとおりです。

mars product returns MARS
snikers product returns SNIKERS
于 2012-10-23T12:47:55.087 に答える
0

戻り型の共分散のおかげでまったく問題ありません。これは C++ の機能であり、派生クラスで実装された仮想関数が、基本クラスで実装された (または純粋仮想の場合は宣言された) 関数と同じクラスへのポインター (または参照) を返すことができること、またはポインター (または参照) を返すことができることを意味します。 ) から派生したクラスに。これは、コードが正しい C++ であることを意味します。

前の段落で説明したように、戻り値の型の共分散のために、コードが正しくコンパイルされるとあなたは言います。また、実行時にエラーが発生するとおっしゃっていますが、発生しているエラーが何であるかを指定しない限り、それについてはお手伝いできません。

于 2012-10-23T13:27:54.967 に答える