Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [c++]funzione ritorno puntatore

    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;
    }

  2. #2
    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;
    }

  3. #3
    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;
    }
    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);
    };
    se faccio come mi hai detto il metodo getErBadIO mi da un errore di casting...
    grazie

  4. #4
    Modifica getErBadIO in modo che restituisca un puntatore a stringa costante:
    codice:
    const string * getErBadIO();
    const string * MyException::getErBadIO(){
    	return this->erBadIO;
    }
    e dato che ci sei, visto che getErBadIO non modifica alcun membro, diamo un aiutino al compilatore:

    codice:
    const string * getErBadIO() const;
    const string * MyException::getErBadIO() const{
    	return this->erBadIO;
    }

  5. #5
    Ops scusa ho notato solo ora come inizializzi il membro erBadIO:

    codice:
    MyException::MyException(){
    	string bad;
    	bad = "err";
    	this->erBadIO = &bad; // CRASH GARANTITO al suo primo utilizzo!
    }
    perché assegni a erBadIO l'indirizzo dell'oggetto bad, che all'uscita del metodo non esisterà più.

  6. #6
    Hai ragione! Infatti non mi stampava niente e mi chiedevo il perchè

  7. #7
    Altra considerazione, siccome getErBadIO restituisce l'indirizzo di un oggetto std::string, allora la seguente che hai scritto:
    codice:
    void MyException::showErBadIO(){
    	cout << this->getErBadIO() << endl;
    }
    stamperà appunto l'indirizzo dell'oggetto, non la stringa.

    Per stampare la stringa devi fare:
    codice:
    void MyException::showErBadIO(){
    	cout << *(this->getErBadIO()) << endl;
    }
    ma ovviamente ti andrà in crash (o ti stamperà una stringa molto stramba), perché (vedi post precedenti), l'indirizzo non è valido.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.