定义在C ++中需要构造函数参数的类成员

时间:2013-08-13 20:28:10

标签: c++ class constructor

假设我有一个类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); }
};

但有没有办法使用指针?

2 个答案:

答案 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;
};