如何在C++类构造函数中实例化其他类对象供自身成员函数访问
问题原因
报错是因为你把red_pin、green_pin、blue_pin定义在了DigitalRGBPin构造函数的局部作用域中,这类局部变量仅在构造函数执行期间有效,构造结束就会被系统回收销毁,其他成员函数自然无法访问。这个问题和类是否嵌套没有关联。
解决方案
你只需要把三个DigitalGPGIOPin对象设为DigitalRGBPin的成员变量即可,不需要嵌套类、也不需要重复定义DigitalGPIOPin。由于DigitalGPIOPin没有默认无参构造函数,需要用构造函数初始化列表完成成员初始化,具体修改如下:
1. 修复GPIOPin.hpp的语法问题并添加成员声明
先补全原有代码遗漏的分号,同时在DigitalRGBPin中声明三个GPIO对象成员:
// GPIOPin.hpp file class DigitalGPIOPin { public: int id; // Pin identifier int io; // 补充遗漏的分号,INPUT or OUTPUT DigitalGPIOPin(int identifier, int io_type); void initialize_pin(); }; class DigitalRGBPin { public: // 新增三个DigitalGPIOPin类型的成员变量 DigitalGPIOPin red_pin; DigitalGPIOPin green_pin; DigitalGPIOPin blue_pin; DigitalRGBPin(int red_identifier, int green_identifier, int blue_identifier); void initialize_rgb_pin(); };
2. 修改GPIOPin.cpp中DigitalRGBPin的构造函数实现
用初始化列表完成三个GPIO成员的初始化,删掉构造函数内的局部变量定义:
DigitalRGBPin::DigitalRGBPin(int red_identifier, int green_identifier, int blue_identifier) // 初始化列表直接构造三个成员对象 : red_pin(red_identifier, OUTPUT), green_pin(green_identifier, OUTPUT), blue_pin(blue_identifier, OUTPUT) { // 无需额外逻辑,原有局部变量定义全部删除 }
3. 直接调用成员方法即可
修改后的initialize_rgb_pin可以正常访问三个成员对象:
void DigitalRGBPin::initialize_rgb_pin() { red_pin.initialize_pin(); green_pin.initialize_pin(); blue_pin.initialize_pin(); }
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

