You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 14:27:04