Come inizializzare un campo const nel costruttore?

Immaginate di avere una class C ++ Foo e una class Bar che deve essere creata con un costruttore in cui viene passato un puntatore Foo e questo puntatore è destinato a rimanere immutabile nel ciclo di vita dell’istanza Bar. Qual è il modo corretto di farlo?

In effetti, pensavo di poter scrivere come il codice qui sotto ma non lo compila ..

class Foo; class Bar { public: Foo * const foo; Bar(Foo* foo) { this->foo = foo; } }; class Foo { public: int a; }; 

Qualsiasi suggerimento è benvenuto.

    È necessario farlo in un elenco di inizializzazione:

     Bar(Foo* _foo) : foo(_foo) { } 

    (Nota che ho rinominato la variabile in entrata per evitare confusione.)

    Credo che devi farlo in un inizializzatore. Per esempio:

     Bar(Foo* foo) : foo(foo) { } 

    Come nota a margine, se non cambierai mai a cosa punta foo, passalo come riferimento:

     Foo& foo; Bar(Foo& foo) : foo(foo) { } 

    L’inizializzazione di membri const e di altri casi speciali (come classi parent) può essere eseguita nell’elenco di inizializzazione

     class Foo { private: const int data; public: Foo(int x) : data(x) {} }; 

    O, allo stesso modo, per l’inizializzazione dei genitori

     class Foo { private: int data; public: Foo(int x) : data(x) {} }; class Bar : Foo { public: Bar(int x) : Foo(x) {} }; 

    È necessario inizializzare foo nell’elenco di inizializzazione.

     class Bar { Foo* const foo; public: Bar(Foo* f) : foo(f) {...} }; 

    Usa un riferimento:

     Foo& foo; Bar(Foo& f) : foo(f) { } 

    È quindi ansible fare riferimento a foo facilmente in Bar :

     foo.doSomething(); 

    prova: Bar(Foo* xfoo) : foo(xfoo) {}