Ответ 1
Вам нужно сделать это в списке инициализаторов:
Bar(Foo* _foo) : foo(_foo) {
}
(Обратите внимание, что я переименовал входящую переменную, чтобы избежать путаницы.)
Представьте, что у меня есть класс С++ Foo и класс Bar, который должен быть создан с помощью конструктора, в котором передается указатель Foo, и этот указатель должен оставаться неизменным в жизненном цикле экземпляра Bar. Каков правильный способ сделать это?
На самом деле, я думал, что могу писать, как код ниже, но он не компилируется.
class Foo;
class Bar {
public:
Foo * const foo;
Bar(Foo* foo) {
this->foo = foo;
}
};
class Foo {
public:
int a;
};
Любое предложение приветствуется.
Вам нужно сделать это в списке инициализаторов:
Bar(Foo* _foo) : foo(_foo) {
}
(Обратите внимание, что я переименовал входящую переменную, чтобы избежать путаницы.)
Я считаю, что вы должны сделать это в инициализаторе. Например:
Bar(Foo* foo) : foo(foo) {
}
В качестве побочного примечания, если вы никогда не измените, какие точки foo, передайте его в качестве ссылки:
Foo& foo;
Bar(Foo& foo) : foo(foo) {
}
Инициализация членов константы и других особых случаев (таких родительских классов) может быть выполнена в списке инициализаторов
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) {}
};
Вам нужно инициализировать foo в списке инициализаторов.
class Bar {
Foo* const foo;
public:
Bar(Foo* f) : foo(f) {...}
};
Используйте ссылку:
Foo& foo;
Bar(Foo& f) : foo(f) { }
Вы можете легко обращаться к foo
в Bar
:
foo.doSomething();
попробуйте: Bar(Foo* xfoo) : foo(xfoo) {}