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

boost factory with different products' return value

本文关键字:工厂 回报      更新时间:2023-10-16

我使用Boost Factory创建产品,我想做的是为其DoSomething()调用不同的产品,但问题是我希望每个产品的返回值都不同,而所有产品都它们是结构。我想要producta-> dosomething(),然后其返回值将为structa,对于productb-> dosomething(),其返回值将为strucb。所有结构都从基本struct驱动吗?感谢您的解决方案,非常感谢!

您可以声明将定义基本方法和变量的基本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

完全没有问题,这要归功于返回类型协方差。这是C 功能,意味着在派生类中实现的虚拟函数可以将指针(或引用)返回与在base类中实现的函数(或声明的纯虚拟)或指针相同的类别的类别。(或引用)源自该类的类。这意味着您的代码是正确的C 。

您说,由于返回类型协方差,您的代码正确编译了,如前一段中所述。您还说您在运行时会遇到错误,但是恐怕除非您指定您遇到的这些错误,否则我们无法为您提供帮助。