C ++类中的指针成员变量初始化,具有非指针值

时间:2016-03-06 20:30:16

标签: c++ class pointers initialization

在我开始之前,我想指出我已经用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 )

我很感激您的任何反馈,感谢您的帮助!

3 个答案:

答案 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))
{

}