0

className() を呼び出す QMetaData と QObject を調べてきました。これを自分のクラスで複製したいのですが、QT がどのようにそれを行うのかわかりません。つまり、次のことを行いますが、正しいクラスが出力されません (構文エラーは無視してください)。

#include <iostream>

#define CLASS(name)              \
    std::string className() {    \
        return #name;            \     
    }                           

class A {
public:
   CLASS(A) 

   A(){}
   ~A(){}  

   void output() {
       std::cout << className() << std::endl;
   }
};

class B: public A{
public:
   CLASS(B)
   B(){}
   ~B(){}
};

int main() {
   B b;
   b.output();    // This obviously outputs "A" but I would
                  // like it to output "B" from the base class
                  // function
   return 0;
}

Qt では、Q_OBJECT マクロだけのコードを追加する必要はなく、基本クラスに出力関数がある場合でも、基本クラスから派生クラスの className を取得できます (Qt では QObject:: を意味します)。 debugObjectTree()))。基本クラスがその派生クラスのクラス名を出力できる場合、派生クラスに余分なコードを追加せずに (おそらくマクロを除く)、Qt はどのようにこの効果を達成するのでしょうか?

前もって感謝します。

4

1 に答える 1

1

これには、動的ディスパッチ(つまり、c ++の仮想関数)が必要です。

マクロ virtualに前に追加するだけです。std::string className()

#define CLASS(name)              \
virtual std::string className() {    \
    return #name;            \     
}  

http://ideone.com/Kr0Sc

于 2012-07-23T14:41:58.107 に答える