Как инициализировать поле const в конструкторе?

Представьте, что у меня есть класс С++ Foo и класс Bar, который должен быть создан с помощью конструктора, в котором передается указатель Foo, и этот указатель должен оставаться неизменным в жизненном цикле экземпляра Bar. Каков правильный способ сделать это?

На самом деле, я думал, что могу писать, как код ниже, но он не компилируется.

class Foo;

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

class Foo {
public:
  int a;
};

Любое предложение приветствуется.

Ответ 1

Вам нужно сделать это в списке инициализаторов:

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

(Обратите внимание, что я переименовал входящую переменную, чтобы избежать путаницы.)

Ответ 2

Я считаю, что вы должны сделать это в инициализаторе. Например:

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

В качестве побочного примечания, если вы никогда не измените, какие точки foo, передайте его в качестве ссылки:

Foo& foo;

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

Ответ 3

Инициализация членов константы и других особых случаев (таких родительских классов) может быть выполнена в списке инициализаторов

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

Или, аналогично, для инициализации родителя

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

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

Ответ 4

Вам нужно инициализировать foo в списке инициализаторов.

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

Ответ 5

Используйте ссылку:

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

Вы можете легко обращаться к foo в Bar:

foo.doSomething();

Ответ 6

попробуйте: Bar(Foo* xfoo) : foo(xfoo) {}