假设我有一个类Foo
,其构造函数具有必需参数。并进一步假设我想定义另一个类Bar
,它具有Foo
类型的对象作为成员:
class Foo {
private:
int x;
public:
Foo(int x) : x(x) {};
};
class Bar {
private:
Foo f(5);
};
编译它会产生错误(在这种情况下,g ++给出“error: expected identifier before numeric constant
”)。例如,Foo f(5);
看起来像编译器的函数定义,但实际上我希望f
是用值5初始化的Foo
实例。我可以使用指针解决问题:
class Foo {
private:
int x;
public:
Foo(int x) : x(x) {};
};
class Bar {
private:
Foo* f;
public:
Bar() { f = new Foo(5); }
};
但有没有办法使用指针?
答案 0 :(得分:3)
带指针的版本非常接近 - 修改如下(见下面的评论):
class Foo {
private:
int x;
public:
Foo(int x) : x(x) {};
};
class Bar {
private:
Foo f; // Make f a value, not a pointer
public:
Bar() : f(5) {} // Initialize f in the initializer list
};
答案 1 :(得分:1)
如果你有C ++ 11支持,可以在声明时初始化f
,但不能用圆括号()
初始化:
class Bar {
private:
Foo f{5}; // note the curly braces
};
否则,您需要使用Bar
的构造函数初始化列表。
class Bar {
public:
Bar() : f(5) {}
private:
Foo f;
};