在我开始之前,我想指出我已经用Google搜索了一段时间这个问题并且没有找到满意的答案。我也知道Stack Overflow上有一个very similar question,但它对我的情况没有任何帮助。
这是我的代码:
class A
{
private:
int x;
int y;
public:
A( int x, int y );
// other member functions
};
class B
{
private:
int score;
A* a;
public:
B( int x, int y ); // Regular constructor
// other member functions
};
实现:
// Default constructor with member initialisation
A::A( int x, int y )
: x( x ), y( y )
{}
// Default constructor with member initialisation
B::B( int x, int y )
: score( 0 ), a( x, y )
{}
我遇到的问题是初始化类B中的指针成员变量* a。我们需要将x,y坐标传递给B类构造函数,但我不能得到g ++来编译它,因为它期望一个指针而不是两个整数。我无法绕过如何将x,y作为参数调用* a指针的初始化。
在赋值问题中,我们不会被要求将*指针成员变量发送到空指针,也不会给出一个用于初始化它的指针。我们只给了x& y坐标。
使用g ++编译时收到的错误是:
error: expression list treated as compound expression in mem-initializer [-fpermissive]
: score( 0 ), a( x, y )
我很感激您的任何反馈,感谢您的帮助!
答案 0 :(得分:0)
尝试
B::B(int x, int y)
: score(0), a(new A(x, y))
{}
您的会员 a 类型为 A * , A * 变量无法通过2整数实例化。您可以在堆中创建 A 的实例,并通过 new 运算符获取指向它的指针。使用此指针,您可以初始化 a 成员。 Ofc,您还应该考虑通过析构函数中的 delete 运算符释放内存。
答案 1 :(得分:0)
您提出问题的方式我假设B是A* a
的创建者和所有者。有了这个要求,使用指针是很奇怪的。对此的自然而明显的解决方案是使用常规成员。
现在您可以使用
解决您遇到的语法问题B::B( int x, int y )
: score( 0 ), a( new A(x, y) )
{}
这是一个坏主意,因为现在你必须在析构函数中清理a
。
B::~B(){
delete a;
}
答案 2 :(得分:0)
有两个问题:
第一:A * a;只创建类型为A的指针,但它不指向该类的任何实例。它需要:A* a = new A;
第二:你不能用int
初始化类指针相反,你可以传递一个类的实例,同时将x,y传递给它的构造函数:
B::B( int x, int y )
: score( 0 ), a(new A(x,y))
{
}