用不同产品的回报价值提升工厂
boost factory with different products' return value
我使用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 。
您说,由于返回类型协方差,您的代码正确编译了,如前一段中所述。您还说您在运行时会遇到错误,但是恐怕除非您指定您遇到的这些错误,否则我们无法为您提供帮助。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 使用Unique_ptr确保工厂中的对象唯一
- 带有继承的C++工厂
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 工厂方法:分配和strcpy_s的差异
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 这个工厂类在这个C++视频中的意义何在?
- 此工厂功能有什么问题?
- 注册对对象工厂的调用会导致段错误
- 工厂设计模式优化
- 在 C++ 中返回新的构造函数(*this)工厂
- 确保在编译期间仅同时使用来自同一工厂的对象
- 在工厂或C++类中包含数据库 .h 文件
- 在基类中编写工厂方法
- C++ 模板函数无法将"std:string"转换为"double"作为回报
- WIC 工厂将始终在 Windows7 上为 nullptr("What's a Creel?"教程中使用)
- 抽象工厂结构的差异
- 编写可测试的代码 - lambda 函数和unique_ptr中的basic_istream工厂
- 下面抽象工厂设计模式的实现是正确的吗
- 用不同产品的回报价值提升工厂