相关疑难解决方法(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万
查看次数

ld链接器问题:--whole-archive选项

--whole-archive我见过的唯一真正使用的链接器选项是从静态库创建共享库.最近我遇到了Makefile(s),它在链接内部静态库时总是使用这个选项.这当然会导致可执行文件不必要地引入未引用的目标代码.我对此的反应是,这是完全错误的,我在这里遗漏了什么吗?

我的第二个问题与我读到的有关整个存档选项的内容有关,但无法完全解析.--whole-archive如果可执行文件还链接到共享库,而该共享库又(部分地)具有与静态库相同的目标代码,则在与静态库链接时应该使用该 选项.这是共享库,静态库在目标代码方面有重叠.使用此选项将强制在可执行文件中解析所有符号(无论使用情况).这应该避免目标代码重复.这是令人困惑的,如果一个符号在程序中被引用,它必须在链接时唯一地解决,这个关于复制的业务是什么?(如果这一段不是清晰的缩影,请原谅我)

谢谢

linker build-process static-libraries

41
推荐指数
4
解决办法
5万
查看次数