假设我有一个 C++ 类 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) {
}
初始化 const 成员和其他特殊情况(例如父类)可以在初始化列表中完成
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) {}
如果在设置成员之前需要一些计算,请使用 const_cast:
class Bar {
public:
Foo * const foo;
Bar(Foo* foo) :foo(null_ptr) {
//some calculations ...
const_cast<Foo * &>(this->foo) = foo;
}
};