我使用boost工厂来创建产品,我想做的是为其调用不同的产品DoSomething()
,但问题是我希望每个产品的返回值都不一样,而且都是结构体。我想要ProductA->DoSomething(),那么它的返回值为structA,对于ProductB->DoSomething(),它的返回值为strucB。所有的结构都是从基地驱动的struct
,有可能吗?感谢您的解决方案,非常感谢!
问问题
195 次
2 回答
1
您可以声明 base 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
于 2012-10-23T12:47:55.087 回答
0
由于返回类型协方差,完全没有问题。这是一个 C++ 特性,意味着在派生类中实现的虚函数可以返回指向与在基类中实现(或声明,如果是纯虚拟的)函数或指针(或引用)相同的类的指针(或引用) ) 到从那个派生的类。这意味着您的代码是正确的 C++。
您说您的代码可以正确编译,因为返回类型协方差应该是正确的,如上一段所述。您还说您在运行时遇到错误,但恐怕我们无法帮助您,除非您指定您遇到的错误是什么。
于 2012-10-23T13:27:54.967 回答