这个构造函数有什么问题?

时间:2011-10-07 17:25:53

标签: c++

class Ball
{
    public:
    int i,j,iplus,jplus;
    Ball(int i , int j , int iplus , int jplus)
    {   iplus=1; 
        jplus=1; 
        i=400;
        j=300;
    }
};
int main()
{
        Ball toop(Ball);
}

我收到以下错误:

  

请求'toop'中的成员'jplus',这是非类型'Ball(Ball)'

5 个答案:

答案 0 :(得分:3)

Ball toop(Ball);

应该是这样的:

Ball toop(10,20,30,40);

无意中(与大多数用户一样),您创建的内容在C ++中称为 Most Vexing Parse
它不像你想象的那样创建一个对象,而是声明一个函数,它将Ball作为输入参数并返回Ball

答案 1 :(得分:2)

Ball toop(Ball); //function declaration

它声明了一个函数toop,它接受​​一个Ball类型的参数,并返回Ball。它没有定义对象。

我想你想写这样的东西:

Ball toop(1,2,3,4); //object definition

除此之外,你应该在构造函数中使用member-initialization-list:

Ball(int i , int j , int iplus , int jplus) 
    : i(i), j(j), iplus(iplus), jplus(jplus)
{ //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ its called member-initialization-list
}

此处,语法i(i)看起来很奇怪,但这意味着另一个外部i已使用内部i初始化。内部i是构造函数参数名称,外部i是类的成员,如下所示:

 : i (i), j(j), iplus(iplus), jplus(jplus)
   ^  ^
   |  parameter-name
   class-member-name

类似的解释也适用于其他人:j(j), iplus(iplus), jplus(jplus)

答案 2 :(得分:1)

 Ball toop(Ball);

声明一个函数。

您没有显示其余代码,但它说

 toop.jplus

其他地方。那不会飞,因为toop是一个函数指针(非类型)。函数类型不支持成员访问运算符.),因此出现错误消息。

Ball toop(1,2,3,4);
int y = toop.jplus;

会奏效。虽然我对你在构造函数中想要实现的内容感兴趣:)

我建议:

class Ball
{
  public:
    int i,j,iplus,jplus;
    Ball() : jplus(1), iplus(1), i(400), j(300) 
    {   
    }
};
int main()
{
        Ball toop; // **not** toop()!
        int test = toop.j; // 300
}

答案 3 :(得分:1)

您忘记发布完整的测试用例。 The code you posted is perfectly valid.

您的main可能真正的样子是:

int main() {
   Ball toop(Ball);
   toop.jplus = 2; // or something
}

除非您尝试创建toop,否则您实际上只是声明了一个名为toop的函数,它接受并返回Ball类型的对象。我不太清楚为什么你这样做。

要使用构造函数并创建对象,请使用如下所示的代码:

Ball toop(1,2,3,4);

请下次发布一个重现问题的实际测试用例。你很幸运:

  • 错误消息使问题消失
  • 我很好

答案 4 :(得分:0)

Ball toop(Ball);

是错误的,因为你用4个参数声明它,所以你应该传递这四个参数。就像你的构造函数将4个整数作为参数所以传递4个整数值

Ball toop(0,0,0,0);

或者

int x=0;
Ball toop(x,x,x,x);