2010-06-19 25 views
18

Web'i kendim ve etrafımdaki karışıklıktan sonra, bir void *' in hedefini (bir dizedir) std :: stringine dönüştüremiyorum. Bir C dizesine ulaşmak için this page tarafından önerilen şekilde sprintf(buffer, "%p", *((int *)point)); kullanmayı denedim, ancak boşuna. Ve ne yazık ki, evet, SDL'nin kendi KULLANICI ORTAK yapısında kullandığı gibi bir boşluk kullanmalıyım *.Bir void * 'a std :: string dönüştürülmesi

ilgilenenler için ben Userevent doldurmak için kullanıyorum kodudur:

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

Herhangi bir fikir?

DÜZENLEME: Tüm yanıtlar için teşekkürler, sadece void * 'i bir std :: string *' e çevirmem gerekiyor. Aptal ben. Çok teşekkür ederim beyler! Eğer bir stringstream kullanabilirsiniz metin olarak adres biçimlendirmek için çalışıyor ise

+1

STL nedir, STL'de KULLANICI nedir? C++ böyle bir şey yok. – GManNickG

+1

Ne yapmaya çalışıyorsun? Neye işaret eden bir void * işaretçiniz var? –

+0

Sanırım SDL UserEvent http://linux.die.net/man/3/sdl_userevent – Stephen

cevap

16
Sadece (muhtemelen siz bunu kullanmakta olduğunuz kapsamını daha uzun yaşamak gerektiğinden) dinamik olarak tahsis etmek gerek

sonra ileri geri dökme:

// 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; 
+0

Tam olarak aradığım şey. Teşekkürler! – Lewis

+0

Bu yanıtın, işaretçinin hedefinin kapsam dışına çıkmasını önlediğinden, diğer yanıtların üzerinde bir kenar olduğunu unutmayın. Tekrar teşekkürler! – Lewis

4

: O ilgilendiğiniz neler değilse

std::stringstream strm; 
strm << ptr; 
std::string str = strm.str(); 

// str will now have something like "0x80004567" 

, sorunuzu netleştirin.

+0

Üzgünüz, hiç de net değildi. Demek istediğim, boşluğun * bir dizeye (bir dizgedir) işaret ettiğini dönüştürmekti. – Lewis

+0

Ben * bunu yapmaya çalışıyordum - teşekkürler! (Mod Up) – Brad

7

Yorumunuza bağlı olarak "Ne demek istediğim void * 'in bir dizeye (bir dizedir) işaret ettiğini dönüştürmekti."

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

Sadece dizeye geri yayınlayabileceğim: Eğer ptr aslında std::string işaret doğrulamak için o olduğunu

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

Not

varsayarsak bu var. Yanılıyorsanız ve başka bir şeye işaret ediyorsa, bu tanımlanmamış davranışa neden olur.

+0

Tam olarak aradığım şey bu. Çok teşekkürler! – Lewis

1

geçersiz bir const char * Eğer Daha sonra std :: string yapıcısını arayabilirsin, yani

const char* cakes = something; 
std::string lols = std::string(cakes); 
+0

Genelde bunun böyle olduğunu düşünemezsiniz, bu nedenle önerileriniz bölümleme ihlaline yol açabilir. Lütfen kaldırmayı düşünün. – einpoklum

İlgili konular