2011-10-21 49 views
11

Trong một hệ thống mà đối tượng đã đăng ký phải có tên duy nhất, tôi muốn sử dụng/bao gồm con trỏ this của đối tượng trong tên. Tôi muốn một cách đơn giản nhất để tạo ??? nơi:Chuyển đổi con trỏ "này" thành chuỗi

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

+0

chuyển đổi nó thành chuỗi hex đại diện cho địa chỉ? –

+0

Xem câu trả lời cho câu hỏi này: http://stackoverflow.com/questions/1255366/how-can-i-append-data-to-a-stdstring-in-hex-format – tenfour

+1

nghe như một ý tưởng tồi: bạn ' gắn lại danh tính của đối tượng với vị trí bộ nhớ của nó: nếu bạn cố gắng di chuyển nó trong một phiên bản tương lai của ứng dụng của bạn thì sao? Mã của bạn sẽ phá vỡ theo những cách rất khó chịu. – akappa

Trả lời

23

Bạn có thể sử dụng chuỗi đại diện của địa chỉ:

#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

Tôi đã thử nghiệm mà không có dàn diễn viên làm mất hiệu lực *, và nó cũng hoạt động. Có cần thiết vì một số lý do không? – Willy

+2

'ss << this' có thể gọi' operator << 'chấp nhận' T const * const' làm đối số, trong trường hợp này bạn sẽ không nhận được địa chỉ dưới dạng chuỗi. Đây là những gì tôi có nghĩa là: http://coliru.stacked-crooked.com/a/cded799e93012de6 – Nawaz

2

Bạn có thể sử dụng ostringstream địa chỉ của con trỏ này và đặt giá trị của ostringstream rằng như chuỗi?

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

Bạn có nghĩa là định dạng con trỏ chính nó như là một chuỗi?

std::ostringstream address; 
address << (void const *)this; 
std:string name = address.str(); 

Hoặc ... có, tất cả các câu trả lời tương đương khác trong khoảng thời gian tôi đã nhập loại này!

-1

Trong hệ thống mà đối tượng đã đăng ký phải có tên duy nhất, tôi muốn sử dụng/bao gồm con trỏ của đối tượng này trong tên.

Địa chỉ của đối tượng không nhất thiết phải là duy nhất. Ví dụ: Bạn phân bổ động một đối tượng như vậy, sử dụng nó một lúc, xóa nó, và sau đó phân bổ một đối tượng như vậy. Đối tượng mới được cấp phát đó có thể có cùng địa chỉ đối tượng như trước đó.

Có nhiều cách tốt hơn để tạo tên duy nhất cho một thứ gì đó. Bộ đếm mật mã, ví dụ:

// 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

Nhưng một khi đối tượng đầu tiên bị phá hủy, nó không tồn tại. Vì vậy, địa chỉ IS duy nhất ... nếu tôi phá hủy đối tượng đầu tiên, nó cũng không được đăng ký từ cấu trúc dữ liệu yêu cầu tên. –

Các vấn đề liên quan