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

Pointer Member Variable Initialisation in C++ Classes, with non-Pointer Values

本文关键字:指针 初始化 变量 成员 C++      更新时间:2023-10-16

在我开始之前,我只想指出我已经在谷歌上搜索了这个问题一段时间,但没有找到一个令人满意的答案。 我也知道关于堆栈溢出的一个非常相似的问题,但它并不能完全帮助我的情况。

这是我的代码:

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 指针的初始化。

在赋值问题中,我们没有被要求将 *a 指针成员变量启动到空指针,也没有给出用于初始化它的指针。 我们只得到x和y坐标。

使用 g++ 编译时收到的错误是:

error: expression list treated as compound expression in mem-initializer [-fpermissive]
  : score( 0 ), a( x, y )

我将不胜感激任何反馈,提前感谢您的帮助!

你陈述问题的方式,我假设 B 是 A* a 的创建者和所有者。 有了这个要求,使用指针是非常奇怪的。 对此的自然而明显的解决方案是使用常规成员。

现在,您遇到的语法问题可以通过以下方式解决

B::B( int x, int y )
:   score( 0 ), a( new A(x, y) )
{}

这是一个坏主意,因为现在您必须清理析构函数中的a

B::~B(){
    delete a;
}

尝试

B::B(int x, int y)
    : score(0), a(new A(x, y))
{}

您的成员 a 是 A* 类型,A* 变量不能由 2 个整数实例化。 您可以在堆中创建 A 的实例,并通过 new 运算符获取指向它的指针。使用此指针可以初始化您的成员。Ofc,您还应考虑通过析构函数中的删除运算符释放内存。

有 2 个问题:第一:A* a; 仅创建类 A 类型的指针,但不指向类的任何实例。它要求:A* a = new A;

第二:不能用int初始化类指针

相反,您可以传递类的实例以及将 x,y 传递给其构造函数:

B::B( int x, int y )
    :   score( 0 ), a(new A(x,y))
{
}