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