1

FileTwo.h の内部

   #include"iostream"
    using namespace std ;
    class FileTwo{
    public:
      FileTwo(){
        cout<<"constructor for";//Here want to show the object for which the constructor has been called
      }
    ~Filetwo(){
      cout<<"Destructor for ";//Here want to show the object for which the destructor has been called 
    };

main.cpp の内部

#include"Filetwo.h" 

int main(){
  FileTwo two ;
  return 0;
}

このサンプル プログラムは非常に小さいので、コンストラクタとデストラクタが呼び出されたオブジェクトを見つけることができます。しかし、大きなプロジェクトの場合、オブジェクト名を知る方法はありますか? 前もって感謝します 。

4

3 に答える 3

4

オブジェクトに名前を付けない限り、それは不可能です。このようなもの :

#include <iostream>
#include <string>
using namespace std;
class FileTwo {
  public:
    FileTwo(const std::string &myName) : name(myName){
      cout<<"constructor for" << name;//Here want to show the object for which the constructor has been called
    }
    ~Filetwo(){
      cout<<"Destructor for " << name;//Here want to show the object for which the destructor has been called 
    }

  private:
    std::string name;
};

次に、メインを次のように変更します。

#include"Filetwo.h" 
int main(){
  FileTwo two("two 11");
}
于 2013-01-08T09:10:25.177 に答える
3

可能です。コンパイルが__PRETTY_FUNCTION__or __func__(これを参照) をサポートしている場合は、次のようにすることができます。

#include <iostream>
using namespace std;
class FileTwo{
  public:
    FileTwo(){
      cerr<<"constructor for "<< __PRETTY_FUNCTION__ <<" at "<<&(*this)<<endl;
    }
    ~FileTwo(){
      cerr<<"Destructor for "<< __PRETTY_FUNCTION__ <<" at "<<&(*this)<<endl;
    }
};

int main(){
  FileTwo two;
  return 0;
}

cerrまた、この出力がすぐにフラッシュされ、プログラムがクラッシュしても失われないように出力したことに注意してください。また、各オブジェクトには一意の*thisポインターがあるため、それを使用して、特定のオブジェクトがいつ作成されているか、または削除されているかを確認できます。

私のコンピューターでの上記のプログラムの出力は次のとおりです。

constructor for FileTwo::FileTwo() at 0x7fff641cde40
Destructor for FileTwo::FileTwo() at 0x7fff641cde40

__func__は C99 標準の識別子であることに注意してください。C++0x は、「実装定義の文字列」の形式でサポートを追加します。

__FUNCTION__は、Visual C++ (ドキュメンテーションを参照) や gcc (ドキュメンテーションを参照) など、一部のコンパイラでサポートされている標準化前の拡張機能です。

__PRETTY_FUNCION__は gcc 拡張機能で、同じようなことを行いますが、よりきれいです。

この質問には、これらの識別子に関する詳細情報があります。

コンパイラによっては、クラスの名前が返される場合がありますが、少し壊れている場合があります。

#include <iostream>
#include <typeinfo>

using namespace std;
class FileTwo{
  public:
    FileTwo(){
      cerr<<"constructor for "<< typeid(*this).name() <<" at "<<&(*this)<<endl;
    }
    ~FileTwo(){
      cerr<<"Destructor for "<< typeid(*this).name() <<" at "<<&(*this)<<endl;
    }
};

int main(){
  FileTwo two;
  return 0;
}

クラスがインスタンス化される変数の名前を取得しようとしている場合(twoあなたの場合)、私の知る限り、これを行う方法はありません。以下はそれをエミュレートします。

#include <iostream>
#include <string>

using namespace std;
class FileTwo{
  public:
    FileTwo(const std::string &myName) : myName(myName) {
      cerr<<"constructor for "<< myName <<" at "<<&(*this)<<endl;
    }
    ~FileTwo(){
      cerr<<"Destructor for "<< myName <<" at "<<&(*this)<<endl;
    }
  private:
    std::string myName;
};

int main(){
  FileTwo two("two");
  return 0;
}
于 2013-01-08T09:53:43.803 に答える
1

オブジェクトに名前を付けることはできません。できることは、名前を保持するプライベート変数を作成することだけです。

using namespace std;
class myClass
{
    private:
    string className;

    public:
    ~myClass()
    {
        cout<<this->className;
    }
};

変数のセッターとゲッターを作成できます。

void SetName(string name)
{
   this->className = name;
}

string GetName()
{
   return this->className;
}
于 2013-01-08T09:26:30.337 に答える