77

想象一下,我有一个 C++ 类 Foo 和一个类 Bar,它必须使用一个传递 Foo 指针的构造函数来创建,并且该指针旨在在 Bar 实例生命周期中保持不可变。正确的做法是什么?

事实上,我以为我可以像下面的代码那样编写,但它不能编译..

class Foo;

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

class Foo {
public:
  int a;
};

欢迎任何建议。

4

6 回答 6

97

您需要在初始化列表中执行此操作:

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

(请注意,我重命名了传入变量以避免混淆。)

于 2009-09-14T20:24:13.670 回答
23

我相信您必须在初始化程序中执行此操作。例如:

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

作为旁注,如果您永远不会更改 foo 指向的内容,请将其作为参考传递:

Foo& foo;

Bar(Foo& foo) : foo(foo) {
}
于 2009-09-14T20:26:00.440 回答
17

初始化 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) {}
};
于 2009-09-14T20:25:36.897 回答
6

您需要在初始化列表中初始化 foo。

class Bar {
    Foo* const foo;
  public:
    Bar(Foo* f) : foo(f) {...}
};
于 2009-09-14T20:25:39.517 回答
0

使用参考:

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

然后,您可以foo轻松 参考Bar

foo.doSomething();
于 2009-09-14T20:24:35.103 回答
0

尝试: Bar(Foo* xfoo) : foo(xfoo) {}

于 2009-09-14T20:25:22.653 回答