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;
};

然后将 main 更改为:

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

有可能的。如果您的编译支持__PRETTY_FUNCTION____func__(请参阅this),那么您可以这样做:

#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;
    }
};

你可以为你的变量创建setter和getter。

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

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