Domanda

Ho una classe il cui costruttore prende un riferimento const a una stringa. Questa stringa funge da nome dell'oggetto e pertanto è necessaria per tutta la durata di un'istanza della classe.

Ora immagina come si potrebbe usare questa classe:

class myclass {
public:
    myclass(const std::string& _name) : name(_name) {}
private:
    std::string name;
};

myclass* proc() {
    std::string str("hello");
    myclass* instance = new myclass(str);
    //...
    return instance;
}

int main() {
    myclass* inst = proc();
    //...
    delete inst;
    return 0;
}

Poiché la stringa in proc () viene creata nello stack e quindi viene eliminata al termine di proc (), cosa succede con il mio riferimento ad esso all'interno dell'istanza della classe? La mia ipotesi è che non sia più valido. Sarebbe meglio conservarne una copia all'interno della classe? Voglio solo evitare qualsiasi copia inutile di oggetti potenzialmente grandi come una stringa ...

È stato utile?

Soluzione

Sì, il riferimento diventa non valido nel tuo caso. Dato che stai usando la stringa, è meglio conservare una copia dell'oggetto stringa nella classe myclass .

Altri suggerimenti

Certamente: copia. Avere un " std :: nome stringa " membro della tua classe. È l'unico modo per controllare la vita.

Se myclass :: _ name non è un riferimento, viene copiato e non diventerà non valido.

Non è necessario eseguire la copia. Dichiara il membro std :: string name (non riferimento) in myclass (che in qualche modo hai omesso del tutto). e passa const char * come argomento. In questo modo costruirai il tuo oggetto nome proprio nella classe senza copiare.

class myclass {
public:
    std::string name;
    myclass(const char *_name) : name(_name) { }
};

myclass *proc() {
    return new myclass("hello");
}

Sì, lo std :: string scomparirà ma la c str "ciao" non sarà come è una costante.

Hai due possibili risposte. Usa c str come riferimento o rendi lo std: string uno staic.

Il campo myclass :: name dovrebbe essere di tipo std :: string. Le stringhe in C ++ sono copiate in scrittura ( http://en.wikipedia.org/ wiki / Copy-on-write ) in modo da non avere problemi con la copia di oggetti di grandi dimensioni.

Conserva una copia della stringa in MyClass, mantenere un riferimento è definitivamente non sicuro. Se ti aspetti che molte istanze abbiano lo stesso nome, dovresti esaminare Modello di progettazione del peso mosca che consente di risparmiare spazio di archiviazione in presenza di molte istanze uguali. Boost.Flyweight è un'implementazione molto comoda di questo modello che ti permette semplicemente di scrivere:

class myclass {
public:
    myclass(const std::string& _name) : name(_name) {}
private:
    boost::flyweight<std::string> name;
};

Alcune implementazioni di std :: string possono farlo dietro le quinte, ma non è necessario. Pertanto non dovresti fare affidamento su questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top