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!

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top