代码之家  ›  专栏  ›  技术社区  ›  JHollanti

C++类指针

c++
  •  1
  • JHollanti  · 技术社区  · 14 年前

    我知道你可以得到这样一个静态方法的引用:

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

    编辑:

    5 回复  |  直到 14 年前
        1
  •  5
  •   Alex Martelli    14 年前

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

    不过,使用RTTI可以获得一些类似的效果 typeid 关键字提供对 std::type_info #include <typeinfo> /GR 对于微软的Visual C++。

        2
  •  1
  •   Mr Fooz    14 年前

    不,类在当前版本的C++中不是一流的对象(不像java、python等其他语言)。

        3
  •  1
  •   Antti Huima    14 年前

    您想要完成的事情可以通过使用函数指针来完成,如果没有其他方法,那么至少如下所示:

    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
  •  0
  •   Beta    14 年前

    你需要的是一个 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));
        }
    };
    
        5
  •  0
  •   Yasser Malaika    11 年前

    虽然纯C++在运行时没有类的概念,但有提供这种功能的库。

    Qt有一个元对象系统,它提供运行时类反射/内省、动态属性和异步通信。

    http://qt-project.org/doc/qt-4.8/qmetaobject.html#details

    此外,欧洲核子研究中心的根提供了类似的功能。请参见TObject和TClass。

    http://root.cern.ch/drupal/content/reflex

    两者都是跨平台和相当工具链兼容。对于更大和更复杂的项目,类似于这样的东西可以消除使用C++与其他语言相比的许多缺点。