2011-10-21 136 views
11

在註冊對象必須具有唯一名稱的系統中,我想在名稱中使用/包含對象的this指針。我想最簡單的方法來創建???其中:將「this」指針轉換爲字符串

std::string name = ???(this);

+0

將它轉換爲表示地址的十六進制字符串? –

+0

看到這個問題的答案:http://stackoverflow.com/questions/1255366/how-can-i-append-data-to-a-stdstring-in-hex-format – tenfour

+1

聽起來像一個壞主意:你'將對象的身份與其內存位置相關聯:如果您嘗試在未來版本的應用程序中移動它,該怎麼辦?你的代碼將以非常不愉快的方式破解。 – akappa

回答

23

您可以使用地址的字符串表示:

#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(); 
+0

我沒有演員測試void *,它也工作。是否有必要出於某些原因? – Willy

+2

'ss << this'可能會調用'operator <<'接受'T const * const'作爲參數,在這種情況下,您將不會獲得地址作爲字符串。這裏是我的意思:http://coliru.stacked-crooked.com/a/cded799e93012de6 – Nawaz

2

您可以使用ostringstream this指針的地址,並把那ostringstream的值作爲字符串?

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

你的意思是格式化指針本身作爲一個字符串?

​​

或...是的,所有其他相同的答案在我花時間輸入這個!

-1

在註冊對象必須具有唯一名稱的系統中,我想在名稱中使用/包含對象的此指針。

對象的地址不一定是唯一的。示例:您動態分配這樣一個對象,暫時使用它,刪除它,然後分配另一個這樣的對象。新分配的對象可能與前一個對象地址具有相同的對象地址。

有更好的方法來爲某些東西生成一個唯一的名稱。一個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") {} 
}; 
+1

但是一旦第一個對象被銷燬,它就不存在了。所以地址是唯一的......如果我銷燬第一個對象,它也會從需要名稱的數據結構中註銷。 –