ciao, se ho una funzione che mi ritorna un puntatore a una stringa come deve essere il prototipo della funzione?
codice:string nomefunzione(){ //così non è corretto ... ... return *a; }
ciao, se ho una funzione che mi ritorna un puntatore a una stringa come deve essere il prototipo della funzione?
codice:string nomefunzione(){ //così non è corretto ... ... return *a; }
codice:#include <iostream> #include <exception> std::string * NewString (const char * theCString){ std::string * a = new std::string (theCString); return a; } int main (int argc, char * const argv[]) { std::string * aString = NewString ("Hello World"); std::cout << (*aString) << std::endl; delete aString; return 0; }
grazie, così funziona mi ero incasinato perchè avevo dichiarato la string const in questo modo:
codice:#include "MyException.h" #include <string> #include <iostream> using namespace std; MyException::MyException(){ string bad; bad = "err"; this->erBadIO = &bad; } MyException::~MyException(){} void MyException::setErBadIO(const string* msg){ this->erBadIO = msg; } void MyException::showErBadIO(){ cout << this->getErBadIO() << endl; } string * MyException::getErBadIO(){ return this->erBadIO; }se faccio come mi hai detto il metodo getErBadIO mi da un errore di casting...codice:#include <string> using namespace std; class MyException{ private: const string* erBadIO; public: MyException(); virtual ~MyException(); string * getErBadIO(); void showErBadIO(); void setErBadIO(const string* msg); };
grazie
Modifica getErBadIO in modo che restituisca un puntatore a stringa costante:
e dato che ci sei, visto che getErBadIO non modifica alcun membro, diamo un aiutino al compilatore:codice:const string * getErBadIO(); const string * MyException::getErBadIO(){ return this->erBadIO; }
codice:const string * getErBadIO() const; const string * MyException::getErBadIO() const{ return this->erBadIO; }
Ops scusa ho notato solo ora come inizializzi il membro erBadIO:
perché assegni a erBadIO l'indirizzo dell'oggetto bad, che all'uscita del metodo non esisterà più.codice:MyException::MyException(){ string bad; bad = "err"; this->erBadIO = &bad; // CRASH GARANTITO al suo primo utilizzo! }
Hai ragione! Infatti non mi stampava niente e mi chiedevo il perchè![]()
Altra considerazione, siccome getErBadIO restituisce l'indirizzo di un oggetto std::string, allora la seguente che hai scritto:
stamperà appunto l'indirizzo dell'oggetto, non la stringa.codice:void MyException::showErBadIO(){ cout << this->getErBadIO() << endl; }
Per stampare la stringa devi fare:
ma ovviamente ti andrà in crash (o ti stamperà una stringa molto stramba), perché (vedi post precedenti), l'indirizzo non è valido.codice:void MyException::showErBadIO(){ cout << *(this->getErBadIO()) << endl; }