Domanda

Io sono appena agli inizi con il C++ e ha ottenuto alcuni problemi nella comprensione di come l'ambito privato variabili membro di una classe funziona.Si prega di consultare il seguente codice

class Foo{
    private:
        std::vector<int> container;
    public:
        // other methods
};

int main(int argc, char* argv[])
{
    Foo* foo = new Foo;
    // other method calls to which foo is passed
    delete foo;
    return 0;
}

Nel codice di cui sopra, la variabile "contenitore" è una variabile membro privata.Sto invocando "Pippo" istanza e passando per molti altri metodi e classi.Di seguito sono i miei dubbi

  1. Quale sarà l'ambito della variabile "contenitore"?Sarà che la variabile esiste fino a quando elimino l'istanza pippo?
  2. Ho bisogno di fare il "contenitore" come un puntatore al vettore?

Grazie per l'aiuto

È stato utile?

Soluzione

  1. Sì, l' vita del contenitore membro durerà più a lungo l'oggetto che lo contiene non esiste, che è fino a quando si chiama delete il puntatore che punta ad esso (foo nel tuo caso).
  2. No, non c'è nessun motivo per farlo.Facendo un puntatore richiede la creazione di un oggetto dinamico di vector<int> che si avrebbe bisogno per gestire il ciclo di vita di (tra cui la chiamata di eliminare il contenitore puntatore).Che è inutile qui.Supponendo che si desidera che il contenitore di durare più a lungo i Foo oggetto, si sta bene con avere direttamente in esso contenute, senza farlo con un puntatore.

Passando il foo puntatore basta passare il puntatore.L'oggetto a cui punta si non essere copiato, solo il puntatore che punta ad esso, se necessaria.Se conosci Java, quindi ti aiuta se ti dico che passa il puntatore è lo stesso come il passaggio di un riferimento a un oggetto in Java, dicono:

Foo f = new Foo();
// just passes the reference (pointer in C++) to doIt. 
// the actual object is not copied
doIt(f);

Altri suggerimenti

Sto invocando "Pippo" istanza

In realtà, la creazione di un'istanza di classe Foo.

In particolare, si sono allocare un blocco di memoria fuori la heap via new().Questo blocco di memoria è abbastanza grande per contenere Pippo::contenitore e quant'altri generali classe Pippo richiede.

(In questo esempio, non c'è nessuno.Con le altre classi, ci potrebbero essere ulteriori attributi o forse un virtuale-puntatore tabella.)

Naturalmente, new() richiama l' (forse di default?) Pippo::Foo() costruttore, che a sua volta inizializza Pippo::contenitore attraverso il std::vector costruttore.

Quale sarà l'ambito della variabile "contenitore"?

contenitore è un attributo [componente] dell'istanza pippo.Esiste fintanto che l'istanza pippo esiste.

Ambito di applicazione-saggio, si può parlare di Pippo::contenitore.Ma non è possibile accedere Pippo::constainer senza un'istanza della classe Pippo.(E. g.L'oggetto pippo.) Pippo::constainer non esiste senza una istanza della classe Pippo.

(Ci sono le variabili di classe che lavoro un po ' diverso, dove un valore condiviso da tutte le istanze.Ma non è il caso qui.)

Questo ambito è IRRILEVANTE pubblico/protected/private/amico socio-controllo di accesso.

E. g., in alcuni Pippo::myPublicMethod() si potrebbe fare riferimento a Pippo::contenitore.Anche se si potrebbe anche rinunciare esplicita di scoping in questa situazione e solo fare riferimento ad esso come contenitore.

Intendiamoci, essendo privato, non è possibile accedere Pippo::contenitore al di fuori della classe Pippo i metodi.

Sarà che la variabile esiste fino a quando elimino l'istanza pippo?

Sì.

Ho bisogno di fare il "contenitore" come un puntatore al vettore?

No.È possibile, ma certamente non è necessario.

In generale, mi raccomando contro l'istanza di classe membri puntatori accoppiato con nuove nel costruttore ed eliminare il distruttore.È inefficiente e fastidioso.(Il costruttore di copia di default può copiare il valore del puntatore, il distruttore, può eliminare lo stesso valore del puntatore due volte).


A seconda delle esigenze, si potrebbe prendere in considerazione:

int main(int argc, char* argv[])
{
  Foo foo;
  // other method calls to which foo is passed
  return 0;
}

pippo sarebbe andato fuori del campo di applicazione dopo return 0;, e automaticamente cancellati.Inoltre, pippo saranno stanziati dallo stack piuttosto che l'heap.


Si potrebbe trovare una copia usata di Con Annotazioni C++ Manuale Di Riferimento utile.È vecchio, ma ha un alto rapporto segnale-rumore.

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