2011-10-21 11 views
11

En un sistema donde los objetos registrados deben tener nombres únicos, quiero usar/incluir el puntero this del objeto en el nombre. Quiero que la forma más sencilla de crear ??? donde:Convierta "este" puntero a la cadena

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

+0

convertirlo como una cadena hexadecimal que representa la dirección? –

+0

Consulte la respuesta a esta pregunta: http://stackoverflow.com/questions/1255366/how-can-i-append-data-to-a-stdstring-in-hex-format – tenfour

+1

suena como una mala idea: usted ' volver a unir la identidad del objeto con su ubicación de memoria: ¿qué sucede si intenta moverlo en una versión futura de su aplicación? Su código se romperá de maneras muy desagradables. – akappa

Respuesta

23

Usted podría utilizar representación de cadena de la dirección:

#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

Probé sin que el yeso se anulara *, y funcionó también. ¿Es necesario por alguna razón? – Willy

+2

'ss << this' podría invocar' operator << 'que acepta' T const * const' como argumento, en cuyo caso no obtendrá la dirección como cadena. Esto es lo que quiero decir: http://coliru.stacked-crooked.com/a/cded799e93012de6 – Nawaz

2

Usted podría utilizar ostringstream la dirección de este puntero y poner el valor de ese ostringstream como cadena?

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

¿Quiere decir formatear el puntero a sí misma como una cadena?

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

O ... sí, todas las otras respuestas equivalentes en el tiempo que me llevó escribir esto!

-1

En un sistema donde los objetos registrados deben tener nombres únicos, quiero usar/incluir el puntero del objeto en el nombre.

La dirección de un objeto no es necesariamente única. Ejemplo: Asigna dinámicamente dicho objeto, lo usa por un tiempo, lo elimina y luego asigna otro objeto. Ese objeto recién asignado podría tener la misma dirección de objeto que la anterior.

Hay formas mucho mejores de generar un nombre único para algo. Un contador gensym, por ejemplo:

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

Pero una vez que se destruye el primer objeto, no existe. Entonces, la dirección ES única ... si destruyo el primer objeto, también no se registra desde la estructura de datos que requiere un nombre. –

Cuestiones relacionadas