我知道您可以获得对这样的静态方法的引用:
typedef void (*pointer)();
pointer p = &MyClass::MyMethod;
但是有没有办法获得类本身的引用?
编辑: 我想将一个类名存储到一个变量中,这样我就可以根据变量的当前值将不同类型的对象实例化为缓冲区或列表。然后我可以对对象列表执行操作(使用多态)。
答案 0 :(得分:5)
不,“类本身”不是C ++运行时存在的对象 - 它只是一个编译时的概念。因此,您无法获得“类对象”本身的引用或指针,只能获取实例,函数(包括静态函数)等等 - 运行时做的事物。
使用RTTI,您可以获得一些类似的效果 - typeid关键字为您提供std::type_info
(您需要#include <typeinfo>
启用此功能)的引用“ for“运行时有问题的类型。 (您可能还需要特殊的编译器开关来启用此功能,例如,对于Microsoft的Visual C ++,/GR
。)
这对你来说是否足够好取决于你想要完成的确切内容。小心澄清?
答案 1 :(得分:1)
不,在当前版本的C ++中,类不是第一类对象(与Java,Python等其他语言不同)。
答案 2 :(得分:1)
你想要完成的任务可以通过一个函数指针完成,如果没有其他方法,那么至少这样:
class Base {
}
class A : public Base {
}
class B : public Base {
}
Base *ConstructA() { return new A(); }
Base *ConstructB() { return new B(); }
Base (* c)();
...
c = ConstructB;
list <Base *> mylist;
mylist.push_back(c());
答案 3 :(得分:0)
您需要的是factory。您可以传递一个类名,它将返回指向该类的(新)实例的指针。但这不是魔术;你必须自己编写这些方法。
当你谈到在列表中存储不同类型的对象时,我认为你的意思是你要存储指向对象的指针,而不是对象本身(否则你将会遇到真正的麻烦)。如果你打算在没有暴力的情况下做到这一点,并且也使用多态,那么这些类最好来自一个共同的基础。
如果它们存在,并且您要使用的构造函数具有相似的签名,则可以使用模板为自己节省一些工作:
class myFactory
{
template <class T>
Base * makeThing(int n, string s) // whatever arguments you like
{
T * ret = new T(n, s);
return(dynamic_cast<Base*>(ret));
}
};
答案 4 :(得分:0)
虽然纯C ++在运行时没有类的概念,但是有些库提供了这样的功能。
Qt有一个元对象系统,提供运行时类反射/内省,动态属性和异步通信。
http://qt-project.org/doc/qt-4.8/qmetaobject.html#details
此外,CERN的ROOT提供类似的功能。参见TObject和TClass。
http://root.cern.ch/drupal/content/reflex
两者都是跨平台且相当兼容的工具链。对于更大和更复杂的项目,尤其是类似这样的东西可以消除使用C ++与其他语言相比的许多缺点。