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)'
答案 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);