gpt4 book ai didi

c++ - Arduino/C++ : initialize static array of objects outside of class constructor

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:07 24 4
gpt4 key购买 nike

我的目标是在创建插件时跟踪一组插件对象:

插件.h

#ifndef PLUGIN_H
#define PLUGIN_H

class Plugin {
public:
static byte instances;
static Plugin plugins[];

Plugin();
~Plugin();
};

#endif

插件.cpp

#include <Arduino.h>
#include "plugin.h"

#define MAX_PLUGINS 3

byte Plugin::instances = 0;
Plugin Plugin::plugins[MAX_PLUGINS];

Plugin::Plugin() {
Plugin::plugins[Plugin::instances++] = *this;
}

Plugin::~Plugin(){
}

我注意到的是

Plugin Plugin::plugins[MAX_PLUGINS];

似乎已经调用了插件构造函数,这不是我想要的,因为派生插件只会在程序的后期创建。如果我尝试创建一个空列表,也会发生同样的情况:

Plugin Plugin::plugins[MAX_PLUGINS] = {};

如何创建一个 NULL 初始化的预定义但可变长度的对象数组?

注意:我读过Array of objects with constructor但我不确定这在 AVR GCC 链中是否可行?

最佳答案

通过在数组中使用指向 Plugin 对象的指针而不是实际的 Plugin 对象!这将允许您对数组进行零初始化,然后将指针分配给您的派生对象。

您目前尝试执行的方法存在缺陷,即使您可以创建一个尚未“创建”的对象数组。

例如

Plugin::Plugin() {
Plugin::plugins[Plugin::instances++] = *this;
}

这将复制插件对象,而不是引用您刚刚创建的对象。

编辑评论:您能否添加为什么 {} 正在实例化对象?

一组空括号,称为默认初始化,

8.5 Initializers To default-initialize an object of type T means:
— if T is an array type, each element is default-initialized;

然后对于每个元素:

— if T is a (possibly cv-qualified) class type (Clause 9), the default constructor (12.1) for T is called...

所以基本上,为每个元素隐式调用空构造函数(默认)。

关于c++ - Arduino/C++ : initialize static array of objects outside of class constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34679977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com