2008-09-16 34 views
2

我有多个类都从基类派生,现在一些派生类将不会被编译,具体取决于平台。我有一个类允许我返回基类的一个对象,但现在派生类的所有名称都被硬编码了。类的C++运行时知识

有没有一种方法来确定类编译什么,在运行时最好,这样我就可以删除链接,而是提供动态库来代替。

回答

3

你在寻找C++运行时类注册吗?我发现这个链接: http://meat.net/2006/03/cpp-runtime-class-registration/

这可能会达到你想要的,我不确定动态加载的模块以及是否可以使用相同的方法注册它们。

+2

该网站似乎已关闭,但我在以下网址找到该网页:http://web.archive.org/web/20100618122920/http://meat.net/2006/03/cpp-runtime-class-registration/ – 2012-08-29 08:20:15

-1

如果每个类都有自己的动态库,只需检查该库是否存在。

0

这听起来像是使用“编译时多态性”或模板策略参数的地方。

参见Modern C++由安德烈Alexandrescu的和他Loki实现设计的立足之本。另见维基百科的Loki页面。

0

在运行时有一些讨厌的编译器特定的技巧来获取类信息。相信我,你不想打开那些蠕虫。

在我看来,这样做的唯一严肃的方法是对每个派生类使用条件编译。在#ifdef块中,定义一个包含正在编译的类名称的常量新的。然后,名字仍然是硬编码的,但都位于中心位置。

2

我不知道你真正想要实现的,但你可以把每个派生类的实现文件单身构造,增加了名称列表,以及一个指向工厂一起。然后列表总是最新的,并且可以创建所有编译的类。

1

通常,依靠运行时类型信息在C++中是一个坏主意。你所描述的看起来像工厂模式。您可能需要考虑为每个平台创建一个特殊的工厂子类,它只会了解该平台上存在的类。

0

派生类的名称必须在C++中进行硬编码。没有其他方式可以使用它们。因此,不仅没有办法自动检测哪些类已经被编译,如果它存在,就没有办法使用这些信息。

如果你可以根据自己的名称来指定在运行时类,是这样的:

的std :: string富=“Derived1”; Base * object = new“foo”; //或任何标记你喜欢的 - 不工作在C++

然后说,如果“Derived1”被编译的能力,或者没有将是有益的。由于您必须直接指定类,例如:

Base * object = new Derived1; //在C++中工作

所有的检查都是在编译时完成的。