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

为何C++/Arduino中全局对象数组需在setup中重新赋值才能使用?

问题描述

在C++/Arduino环境中定义了全局HX711对象数组,创建时已将CELL1至CELL4对象存入数组,但必须在setup函数中先调用begin初始化单个对象,再将其重新赋值回数组,才能正常访问数组内的对象。原本以为创建并赋值后即可直接使用该数组,想了解这一现象的原因。

相关代码:

创建数组的代码

HX711 CELL1;
HX711 CELL2;
HX711 CELL3;
HX711 CELL4;
HX711 celulas[] = {CELL1, CELL2, CELL3, CELL4};       // 存储对象的数组

setup函数中的代码

CELL1.begin(7, 8);
celulas[0] = CELL1;
CELL2.begin(5, 6);
celulas[1] = CELL2;
CELL3.begin(0, 1);
celulas[2] = CELL3;
CELL4.begin(A0, A1);
celulas[3] = CELL4;
问题原因
  • 数组存的是对象副本而非原对象:用CELL1CELL4初始化数组时,C++会生成这些对象的拷贝存入数组。也就是说,数组里的每个元素和对应的CELL1CELL4是完全独立的两个对象,各自拥有自己的成员变量(比如引脚配置、初始化状态)。
  • 全局对象初始化早于setup:所有全局对象(包括CELL1~CELL4和celulas数组)会在程序启动、setup执行前就完成初始化,此时还没调用begin方法,不管是原对象还是数组里的拷贝,都是未初始化的状态。
  • begin只修改原对象的状态:在setup里调用CELL1.begin(7,8)时,只会修改CELL1自身的内部状态,数组里的那个拷贝对象还是当初未初始化的样子。只有把初始化后的CELL1重新赋值给数组元素,才会把已初始化的状态拷贝到数组对应的元素中,这时数组里的对象才能正常工作。
优化方案

如果不想每次初始化后都重新赋值,可以改用指针数组,直接存储原对象的地址:

HX711 CELL1;
HX711 CELL2;
HX711 CELL3;
HX711 CELL4;
HX711* celulas[] = {&CELL1, &CELL2, &CELL3, &CELL4};

之后在setup里直接通过指针初始化原对象,数组访问时直接操作指针指向的原对象即可:

celulas[0]->begin(7,8);
celulas[1]->begin(5,6);
celulas[2]->begin(0,1);
celulas[3]->begin(A0,A1);

这样就省去了重新赋值的步骤,因为数组里存的是原对象的指针,操作指针就是直接操作CELL1~CELL4本身。

内容的提问来源于stack exchange,提问作者rafael gomes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:31:59