C ++构造函数参数作为对象

时间:2019-04-05 12:31:56

标签: c++ c++11

在编译下面的代码时,出现错误。

class shared {
public:
    shared() {
       cout<<"class shared \n";
    }

};

class test1 {      
public:
    test1(shared obj){
        cout<<"class test1 \n";
    }  
};

class test2 {
private:
    shared s_obj;
    test1 test1_obj(s_obj);  // Error statement 
};

int main()
{
    test2 b_obj;
    return 0;
}
ERROR : error: ‘s_obj’ is not a type
     test1 test1_obj(s_obj);

2 个答案:

答案 0 :(得分:4)

您不能像这样初始化您的成员,您应该使用成员初始化列表:

class test2
{
    test2() : test1_obj(s_obj) {}
    private:
    shared s_obj;
    test1 test1_obj;
};

或者您可以按照评论中的说明使用统一初始化:

test1  test1_obj{s_obj};

答案 1 :(得分:2)

此:

test1 test1_obj(s_obj);

most vexing parse

原则上X Y(Z)可以解释为

  1. 声明类型为Y的变量X,并使用值Z初始化,或者
  2. 声明一个函数Y,返回类型X,并接受类型为Z的单个参数。

您想要#1,但是解释#2实际上是强制性的。

也就是说,您要声明一个用test1初始化的s_obj对象,但这实际上是声明了一个名为test1_obj的函数,该函数返回test1并接受一个类型为s_obj的参数(由于错误状态,不存在这种类型)。

这是使用统一初始化的原因之一:

test1 test1_obj{s_obj};

并不是模棱两可的,因为它不会被误认为一个函数。