web-dev-qa-db-fra.com

Conversion d'un vide * à une ficelle STD :: String

Après avoir parcouru le web et déconner de moi-même, je ne peux pas sembler convertir la cible de Void * (qui est une chaîne) à une ficelle STD :: String. J'ai essayé d'utiliser sprintf(buffer, "%p", *((int *)point)); comme recommandé par cette page Pour accéder à une chaîne C, mais en vain. Et malheureusement, oui, je dois utiliser un vide *, car c'est ce que SDL utilise dans leur struct USEREvent.

Le code que j'utilise pour combler l'userespenser, pour les personnes intéressées, est la suivante:

std::string filename = "ResumeButton.png";
SDL_Event button_press;
button_press.type = BUTTON_PRESS;
button_press.user.data1 = &filename;
SDL_PushEvent(&button_press);

Des idées?

EDIT: Merci pour toutes les réponses, j'ai juste besoin de lancer le vide * à une STD :: String *. Que je suis bête. Merci beaucoup les gars!

26
Lewis

Il vous suffit de l'allouer de manière dynamique (car il doit probablement survivre à la portée dans laquelle vous l'utilisez), puis la jette en arrière:

// 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;
22
Stephen

Basé sur votre commentaire "Ce que je voulais dire était de convertir ce que le vide * pointe vers (qui est une chaîne) dans une chaîne."

En supposant que vous avez ceci:

std::string str = ...;
void *ptr = &str;

Vous pouvez simplement revenir à la chaîne:

std::string *pstr = static_cast<std::string *>(ptr);

Notez que c'est sur vous de vérifier que ptr fait en réalité un std::string. Si vous vous trompez et que cela indique quelque chose d'autre, cela entraînera un comportement indéfini.

7
R Samuel Klatchko

Si le vide est un const Char *, vous pouvez simplement appeler le constructeur STD :: String Country avec IT.e.

const char* cakes = something;
std::string lols = std::string(cakes);
1
Puppy