40

C++ でリフレクション メカニズムの実装に取り​​組んでいます。コード内のすべてのオブジェクトは、Class 型の静的メンバー データを含む Object (独自のジェネリック型) のサブクラスです。

class Class{
public:
   Class(const std::string &n, Object *(*c)());
protected:
   std::string name;     // Name for subclass
   Object *(*create)();  // Pointer to creation function for subclass
};

静的なクラス メンバー データムを持つオブジェクトのサブクラスについては、そのサブクラスのコンストラクターへのポインターを使用して「作成」を初期化できるようにしたいと考えています。

4

7 に答える 7

1

メソッドで通常の関数ポインターを使用することはできません。奇妙な構文を持つメソッドポインターを使用する必要があります。

void (MyClass::*method_ptr)(int x, int y);
method_ptr = &MyClass::MyMethod;

これにより、MyClass のメソッドである MyMethod へのメソッド ポインターが得られます。ただし、これは絶対メモリアドレスではないという点で真のポインターではありません。基本的には、クラスへのオフセットです (仮想継承のためにそれよりも複雑ですが、実装固有です)。したがって、メソッド ポインターを使用するには、次のようにクラスを指定する必要があります。

MyClass myclass;
myclass.*method_ptr(x, y);

また

MyClass *myclass = new MyClass;
myclass->*method_ptr(x, y);

もちろん、この時点で、メソッド ポインターを使用してオブジェクト コンストラクターを指すことができないことは明らかです。メソッド ポインターを使用するには、クラスのインスタンスが必要なので、そのコンストラクターは既に呼び出されています。したがって、あなたの場合、Michael の Object Factory の提案がおそらく最善の方法です。

于 2009-06-05T17:02:46.007 に答える
-1

Qt を使用すると、コンストラクターを Q_INVOKABLE として宣言すると、Qt リフレクション メカニズム (QMetaObject) でコンストラクターを呼び出すことができます (それ以上のことはありません)。

class MyClass : public QObject {
   Q_OBJECT
public:
   Q_INVOKABLE MyClass(int foo);
   MyClass *cloningMySelf() {
     return metaObject()->newInstance(Q_ARG(int, 42));
   }
};

その機能のためだけに Qt を組み込みたいと思うかどうかはわかりません ;-) しかし、その方法を見てみたいと思うかもしれません。

http://doc.qt.io/qt-5/metaobjects.html#meta-object-system

于 2015-09-03T22:22:08.787 に答える