在註冊對象必須具有唯一名稱的系統中,我想在名稱中使用/包含對象的this
指針。我想最簡單的方法來創建???
其中:將「this」指針轉換爲字符串
std::string name = ???(this);
在註冊對象必須具有唯一名稱的系統中,我想在名稱中使用/包含對象的this
指針。我想最簡單的方法來創建???
其中:將「this」指針轉換爲字符串
std::string name = ???(this);
您可以使用地址的字符串表示:
#include <sstream> //for std::stringstream
#include <string> //for std::string
const void * address = static_cast<const void*>(this);
std::stringstream ss;
ss << address;
std::string name = ss.str();
您可以使用ostringstream this指針的地址,並把那ostringstream的值作爲字符串?
#include <sstream>
#include <iostream>
struct T
{
T()
{
std::ostringstream oss;
oss << (void*)this;
std::string s(oss.str());
std::cout << s << std::endl;
}
};
int main()
{
T t;
}
你的意思是格式化指針本身作爲一個字符串?
或...是的,所有其他相同的答案在我花時間輸入這個!
在註冊對象必須具有唯一名稱的系統中,我想在名稱中使用/包含對象的此指針。
對象的地址不一定是唯一的。示例:您動態分配這樣一個對象,暫時使用它,刪除它,然後分配另一個這樣的對象。新分配的對象可能與前一個對象地址具有相同的對象地址。
有更好的方法來爲某些東西生成一個唯一的名稱。一個gensym計數器,例如:
// Base class for objects with a unique, autogenerated name.
class Named {
public:
Named() : unique_id(gensym()) {}
Named(const std::string & prefix) : unique_id(gensym(prefix)) {}
const std::string & get_unique_id() { return unique_id; }
private:
static std::string gensym (const std::string & prefix = "gensym");
const std::string unique_id;
};
inline std::string Named::gensym (const std::string & prefix) {
static std::map<std::string, int> counter_map;
int & entry = counter_map[prefix];
std::stringstream sstream;
sstream << prefix << std::setfill('0') << std::setw(7) << ++entry;
return sstream.str();
}
// Derived classes can have their own prefix. For example,
class DerivedNamed : public Named {
public:
DerivedNamed() : Named("Derived") {}
};
但是一旦第一個對象被銷燬,它就不存在了。所以地址是唯一的......如果我銷燬第一個對象,它也會從需要名稱的數據結構中註銷。 –
將它轉換爲表示地址的十六進制字符串? –
看到這個問題的答案:http://stackoverflow.com/questions/1255366/how-can-i-append-data-to-a-stdstring-in-hex-format – tenfour
聽起來像一個壞主意:你'將對象的身份與其內存位置相關聯:如果您嘗試在未來版本的應用程序中移動它,該怎麼辦?你的代碼將以非常不愉快的方式破解。 – akappa