提升工厂的不同产品的回报价值

时间:2012-10-23 11:51:08

标签: c++ design-patterns boost factory

我使用boost工厂来创建产品,我想做的是为DoSomething()调用不同的产品,但问题是我希望每个产品的返回值都不同,并且所有产品都是结构。我想要ProductA-> DoSomething(),然后它的返回值将是structA,对于ProductB-> DoSomething(),它的返回值将是strucB。并且所有结构都从基地struct开始,是否可能?感谢您的解决方案,非常感谢!

2 个答案:

答案 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 ++。

你说你的代码正确编译,因为它应该是返回类型协方差,如前一段所述。你还说你在运行时遇到错误,但我担心除非你指明你得到的错误,否则我们无法帮助你。