Как инициализировать поле const в конструкторе? - PullRequest
65 голосов
/ 15 сентября 2009

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

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

class Foo;

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

class Foo {
public:
  int a;
};

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

Ответы [ 6 ]

77 голосов
/ 15 сентября 2009

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

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

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

18 голосов
/ 15 сентября 2009

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

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

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

Foo& foo;

Bar(Foo& foo) : foo(foo) {
}
14 голосов
/ 15 сентября 2009

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

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) {}
};
6 голосов
/ 15 сентября 2009

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

class Bar {
    Foo* const foo;
  public:
    Bar(Foo* f) : foo(f) {...}
};
2 голосов
/ 15 сентября 2009

Использовать ссылку:

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

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

foo.doSomething();
0 голосов
/ 15 сентября 2009

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

...