C++类中的指针成员变量初始化,具有非指针值
Pointer Member Variable Initialisation in C++ Classes, with non-Pointer Values
在我开始之前,我只想指出我已经在谷歌上搜索了这个问题一段时间,但没有找到一个令人满意的答案。 我也知道关于堆栈溢出的一个非常相似的问题,但它并不能完全帮助我的情况。
这是我的代码:
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))
{
}
相关文章:
- 如何使用数据对象上的常量指针初始化类
- 使用指针初始化 char 数组或字符串 C++
- 使用无效指针初始化指针声明符的行为是否未定义?
- 指针:初始化与声明
- 启动线程会导致指针初始化时出现分段错误
- 使用函数声明进行函数指针初始化 - 是否可能
- 类初始化中的指针初始化
- 结构数组的指针初始化
- 如何从其抽象母类上的指针初始化子类?
- C 用结构指针初始化结构
- 如何用无效指针初始化unique_ptr的向量
- PCL中的这些增强指针初始化是不同的
- 通过指针初始化结构
- 从函数指针初始化成员函数
- 使用作用域内生成的指针初始化静态成员
- 使用"this"指针初始化 std::array
- C++缺乏指针初始化和使用逻辑
- constexpr 使用指针初始化
- C 指针初始化的不良初始化可能是什么后果
- 指针初始化无效?如果不是,那是什么