我使用boost工厂来创建产品,我想做的是为DoSomething()
调用不同的产品,但问题是我希望每个产品的返回值都不同,并且所有产品都是结构。我想要ProductA-> DoSomething(),然后它的返回值将是structA,对于ProductB-> DoSomething(),它的返回值将是strucB。并且所有结构都从基地struct
开始,是否可能?感谢您的解决方案,非常感谢!
答案 0 :(得分:1)
您可以声明将定义基本方法和变量的基础struct ReturnType
。然后,您可以毫无问题地创建产品。
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
答案 1 :(得分:0)
由于返回类型协方差,完全没问题。这是一个C ++特性,意味着在派生类中实现的虚函数可以将指针(或引用)返回到与基类中实现(或声明,如果是纯虚拟)的函数相同的类或指针(或参考)从该派生的类。这意味着您的代码是正确的C ++。
你说你的代码正确编译,因为它应该是返回类型协方差,如前一段所述。你还说你在运行时遇到错误,但我担心除非你指明你得到的错误,否则我们无法帮助你。