如何在C++类中实现指向另一个类实例的指针成员?
C++类指针成员实现错误分析与修正
原代码中的错误点
指针赋值类型不匹配+悬空指针问题:
Class_B构造函数里的class_A_instance = Class_A(b);是错误的。Class_A(b)会创建一个临时Class_A对象,它的类型是Class_A,无法直接赋值给Class_A*类型的指针;而且临时对象会在构造函数执行完毕后立刻销毁,导致class_A_instance变成悬空指针,后续访问会触发未定义行为。成员访问语法错误:
main函数里的class_B_instance::class_A_instance::printNumber();误用了作用域解析符::。class_A_instance是class_B_instance的成员变量,需要用成员访问符.;同时它是指针类型,调用成员函数要使用指针访问符->,正确的访问方式是class_B_instance.class_A_instance->printNumber();。
修正后的代码
#include <iostream> class Class_A { public: int number_; // 用初始化列表初始化成员,更符合C++规范 Class_A(int a) : number_(a) {} void printNumber() { std::cout << "The value in Class_A is " << number_ << std::endl; } }; class Class_B { public: Class_A* class_A_instance; // 动态分配Class_A实例,让指针指向有效内存 Class_B(int b) : class_A_instance(new Class_A(b)) {} // 添加析构函数释放内存,避免内存泄漏 ~Class_B() { delete class_A_instance; } }; int main() { Class_B class_B_instance(3); // 正确的成员访问语法 class_B_instance.class_A_instance->printNumber(); return 0; }
修正说明
- 改用初始化列表初始化
Class_A的成员变量,比构造函数体内赋值更高效且规范。 Class_B构造函数通过new Class_A(b)动态分配对象,保证指针指向有效的堆内存。- 给
Class_B添加析构函数,用delete释放动态分配的Class_A实例,避免内存泄漏。 - 修正
main函数中的成员访问语法,使用. + ->的组合调用指针成员的函数。
内容的提问来源于stack exchange,提问作者3nondatur
相关产品推荐
相关产品推荐

