Conversione di un * vuoto da uno std :: string
-
28-09-2019 - |
Domanda
Dopo indagando il web e fare in giro me stesso, non posso sembrare di convertire bersaglio un * vuoto 's (che è una stringa) in una std :: string. Ho provato con sprintf(buffer, "%p", *((int *)point));
come raccomandato da questa pagina per arrivare a una stringa C, ma inutilmente. E purtroppo, sì, devo usare un * vuoto, come questo è quello che usi SDL nella loro struct USEREVENT.
Il codice che sto usando per riempire l'Userevent, per chi fosse interessato, è il seguente:
std::string filename = "ResumeButton.png";
SDL_Event button_press;
button_press.type = BUTTON_PRESS;
button_press.user.data1 = &filename;
SDL_PushEvent(&button_press);
Tutte le idee?
EDIT: Grazie per tutte le risposte, ho solo bisogno di lanciare il * vuoto per uno std :: string *. Sciocco me. Grazie ragazzi così tanto!
Soluzione
Hai solo bisogno di dinamicamente allocare esso (perché probabilmente ha bisogno di sopravvivere l'ambito che si sta utilizzando in), poi gettato avanti e indietro:
// Cast a dynamically allocated string to 'void*'.
void *vp = static_cast<void*>(new std::string("it's easy to break stuff like this!"));
// Then, in the function that's using the UserEvent:
// Cast it back to a string pointer.
std::string *sp = static_cast<std::string*>(vp);
// You could use 'sp' directly, or this, which does a copy.
std::string s = *sp;
// Don't forget to destroy the memory that you've allocated.
delete sp;
Altri suggerimenti
In base al commento "Quello che volevo dire è stato quello di trasformare ciò che il vuoto * sta puntando (che è una stringa) in una stringa."
Supponendo di avere questo:
std::string str = ...;
void *ptr = &str;
Si può solo lanciare di nuovo alla stringa:
std::string *pstr = static_cast<std::string *>(ptr);
Si noti che è su di voi per verificare che ptr
in realtà punti a un std::string
. Se vi sbagliate e che punti a qualcosa di diverso, questo causerà un comportamento indefinito.
Se si tenta di formattare l'indirizzo di testo è possibile utilizzare un stringstream
:
std::stringstream strm;
strm << ptr;
std::string str = strm.str();
// str will now have something like "0x80004567"
Se questo non è ciò che siete in interessati, si prega di chiarire la tua domanda.
Se il vuoto è un const char *, allora si può chiamare il costruttore std :: string con esso, cioè.
const char* cakes = something;
std::string lols = std::string(cakes);