Inside 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;
}
我知道这个示例程序非常小,所以我们可以找到已经调用了构造函数和析构函数的对象。但是对于大项目有没有办法知道对象名称?提前谢谢。
答案 0 :(得分: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");
}
答案 1 :(得分: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 ++(请参阅documentation)和gcc(请参阅documentation)。
__PRETTY_FUNCION__
是一个gcc扩展,它可以做同样的事情,但更漂亮。
This question提供了有关这些标识符的更多信息。
根据您的编译器,这可能会返回类的名称,但可能会有点损坏。
#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;
}
答案 2 :(得分: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;
}