C++ 类指针

Posted

技术标签:

【中文标题】C++ 类指针【英文标题】:C++ class pointer 【发布时间】:2010-05-15 18:45:05 【问题描述】:

我知道您可以像这样获得对静态方法的引用:

typedef void (*pointer)();
pointer p = &MyClass::MyMethod;

但是有没有办法获得对类本身的引用?

编辑: 我想将类名存储到变量中,这样我就可以根据变量的当前值将不同类型的对象实例化到缓冲区或列表中。然后我可以对对象列表执行操作(使用多态性)。

【问题讨论】:

看看这个最近的问题:***.com/questions/2839470/…,它涵盖了我认为你在问的问题。 它可能涵盖了我所追求的。太糟糕了,我对此一无所知;)但说真的,这有点离题(据我所知),尽管您也可以这样做。 【参考方案1】:

不,“类本身”不是 C++ 运行时存在的对象——它只是一个编译时概念。因此,您无法获得指向“类对象”本身的引用或指针,只能获得实例、函数(包括静态函数)等——确实在运行时存在的事物。

使用 RTTI,您可以获得一些类似的效果 - typeid 关键字为您提供了对 std::type_info 的引用(您需要 #include <typeinfo> 才能启用此功能),它“代表”有问题的类型在运行时。 (您可能还需要特殊的编译器开关来启用此功能,例如,/GR 用于 Microsoft 的 Visual C++)。

这对你来说是否足够好,取决于你想要完成的究竟是什么。想澄清一下吗?

【讨论】:

来自 Java,这是我对 C++ 的困扰......当有一堆你不能用它做的事情时,很难支持 C++。 @JHollanti,我想我明白你的意思——但我对 Java 的谦虚体验是在我掌握 C++ 之后出现的,而且我也有同样的“相反的感觉” “:很多我习惯的东西(指针算法,多重继承,强大的模板,......)只是被我带走了!-)C++和Java(......以及Python,Ruby和Haskell和...... .;-) 只是不允许您在所有其他语言中做自然而重要的事情——关键的心态是,将每种语言用于它自己的优势,而不是作为用另一种语言更好的替代品!-)【参考方案2】:

不,在当前版本的 C++ 中,类不是一等对象(与 Java、Python 等其他语言不同)。

【讨论】:

【参考方案3】:

你想要完成的事情可以通过一个函数指针来完成,如果没有其他方法那么至少像这样:

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());

【讨论】:

谢谢。这实际上对我帮助很大,因为它证实了我应该如何做的意图。【参考方案4】:

您需要的是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));
    
;

【讨论】:

是的,你搞定了,一直到公共基础和指针而不是对象。谢谢你,它有助于了解这些事情应该如何用 C++ 完成。顺便说一句,只是为了澄清,有没有一种方法可以在没有公共基类(或接口)的情况下进行多态性。因为这就是我从你的回复中理解的?【参考方案5】:

虽然纯 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++ 的许多缺点。

【讨论】:

以上是关于C++ 类指针的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 C++ 中一个类的指针可以转换为另一个类的指针?

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

C++智能指针类模板

C++ - 基类指针,方法指针,指派生类,方法?

C++单线程智能指针实现

c++类的成员函数指针如何转为普通指针