相关疑难解决方法(0)

有没有办法从持有类名的字符串中实例化对象?

我有一个文件:Base.h

class Base;
class DerivedA : public Base;
class DerivedB : public Base;

/*etc...*/
Run Code Online (Sandbox Code Playgroud)

和另一个文件:BaseFactory.h

#include "Base.h"

class BaseFactory
{
public:
  BaseFactory(const string &sClassName){msClassName = sClassName;};

  Base * Create()
  {
    if(msClassName == "DerivedA")
    {
      return new DerivedA();
    }
    else if(msClassName == "DerivedB")
    {
      return new DerivedB();
    }
    else if(/*etc...*/)
    {
      /*etc...*/
    }
  };
private:
  string msClassName;
};

/*etc.*/
Run Code Online (Sandbox Code Playgroud)

有没有办法以某种方式将此字符串转换为实际类型(类),以便BaseFactory不必知道所有可能的Derived类,并为每个类都有if()?我可以用这个字符串生成一个类吗?

我认为这可以通过Reflection在C#中完成.C++中有类似的东西吗?

c++ inheritance factory instantiation

135
推荐指数
3
解决办法
8万
查看次数

是否可以在C++中序列化和反序列化一个类?

是否可以在C++中序列化和反序列化一个类?

我已经使用Java 3年了,序列化/反序列化在这种语言中相当简单.C++有类似的功能吗?是否有处理序列化的本机库?

一个例子会有所帮助.

c++ serialization

131
推荐指数
6
解决办法
13万
查看次数

没有Factory的情况下无法实例化的参数化工厂和产品类

我正在按照上一个问题的回复中提出的方式实现Factory类:

工厂方法实现 - C++

它是一个Factory,它存储从字符串到对象创建函数的映射,因此我可以通过字符串标识符从工厂请求不同类型的对象.这个工厂生成的所有类都将继承自一个抽象类(Connection),为不同协议(HTTPConnection,FTPConnection等)的连接提供通用接口.

我很好地掌握了与上述方法相关联的方法是如何运作的.

我遇到问题的地方是试图找出一种机制来防止在不使用Factory的情况下实例化Connection对象.为了使Factory能够完成它的工作,我需要为它提供一个对象创建函数来存储它的地图.我不能提供它的构造函数,因为你不能创建构造函数的函数指针.因此,如上面的链接,必须有一个单独的对象创建函数来返回新对象.但要做到这一点,我需要使这个创建函数或者是类的静态方法,客户端代码能够访问它,或者是一个单独的函数,它需要a)Connection类的构造函数是公共的,或者b)使构造函数成为私有,并使非类成员创建函数成为朋友,这不是继承的,可以'

类似地,如果我只是使用Connection类生成Factory类的朋友,那么它应该生成所以它可以访问它们的私有构造函数,这样可以工作,但是我无法通过abstact基类强制执行,因为朋友不是继承的.每个子类都必须明确地与Factory成为朋友.

任何人都可以建议实施我上面描述的方法吗?

重申要求:

1 - 生成各种对象的工厂,所有对象都基于传入的标识符从相同的基类派生到Factory的Create方法.

2 - 工厂需要生成的所有子类将自动向工厂注册创建函数和标识符(参见上面链接的SO答案)

3 - 工厂生产的所有子类都不应该是可实例化的(可实例化的?)而不经过工厂

4 - 使用继承将#3显式强制作为抽象基类的一部分.删除了某人从抽象基类继承子类的可能性,同时还提供了自由实例化对象的机制.

我想要实现的总体目标是允许将新的Connection类型添加到层次结构中,而不必以任何方式更改Factory类,同时还强制Connection的所有子类不能通过客户端代码直接实例化.

我很乐意这可能不是实现我想要的最佳方式,欢迎其他替代方案的建议.

编辑 - 当我回到家时希望能够更清楚地添加一些代码片段.

c++ singleton constructor factory

5
推荐指数
1
解决办法
813
查看次数