1

たとえば、次のように C++ クラスを定義します。

class cat : public animal
{
  public:
    cat(const char* nameString) : m_name(nameString) {}
    ~cat(){}
    const char* getName() {return m_name.c_str();}

 private:
    std::string m_name;
};

後で:

cat kitty("Garfield");
printf("%s", kitty.getName());

上記のコード例では、ctagsは継承、メンバー、メソッド、アクセス タイプ (パブリック、プライベート) などを教えてくれます。

しかし、kitty が cat のインスタンスであることをどのように確認できますか?

4

3 に答える 3

1
std::cout << "kitty is a: " << typeid(kitty).name() << '\n';

しかし、おわかりのように、まさにあなたが望むものではない可能性があります

型の名前を含む実装定義のヌル終了文字列を返します。保証はありません。特に、返される文字列はいくつかの型で同一であり、同じプログラムの呼び出し間で変化する可能性があります。

を、 などの他の既知の型と比較できます。typeidcat

そして、オブジェクト名と同じ方向/スタイルで作成し、に仮想関数を含めることができますAnimal:

virtual string whatAnimal()const{return "animal";}

および派生クラスでは:

string whatAnimal()const override {return "cat";}

これで、コードで使用する命名規則に関係なく、各タイプの文字列を完全に制御できます。

于 2013-02-20T18:32:54.717 に答える
0

キティが猫のインスタンスであるかどうかを確認する方法についての質問に直接答えるには、次の方法があります。

if(typeid(cat) == typeid(kitty))
    // do something if kitty is a cat

typeid(YourClass).name()を返すことに注意してください。nYourClassここで、nはクラス名の長さです。

于 2013-02-20T20:25:38.797 に答える
0

typeid でオブジェクトのクラス名を取得することができます。ただし、コンパイラは名前を変更するため、実行時に適切にデマングルする必要があります。

例:

#include <iostream>
#include <cxxabi.h>

class cls {};

void main(){
    cls obj;
    int status;
    char * demangled_name = abi::__cxa_demangle(typeid(obj).name(),0,0,&status);
    std::cout << demangled_name << std::endl;
    free(demangled_name);
    return;
}

出力します:

   cls
于 2013-02-20T18:35:28.883 に答える