1

我使用boost工厂来创建产品,我想做的是为其调用不同的产品DoSomething(),但问题是我希望每个产品的返回值都不一样,而且都是结构体。我想要ProductA->DoSomething(),那么它的返回值为structA,对于ProductB->DoSomething(),它的返回值为strucB。所有的结构都是从基地驱动的struct,有可能吗?感谢您的解决方案,非常感谢!

4

2 回答 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 回答