我的目标是在创建插件时跟踪插件对象数组:
plugin.h
#ifndef PLUGIN_H
#define PLUGIN_H
class Plugin {
public:
static byte instances;
static Plugin plugins[];
Plugin();
~Plugin();
};
#endif
plugin.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链是否可行?
答案 0 :(得分:3)
使用指向数组中Plugin
个对象的指针而不是实际的Plugin
个对象!这将允许您对数组进行零初始化,然后在您去的时候为您的派生对象指定指针。
您目前尝试执行的方法存在缺陷,即使您可以创建一个尚未“创建”的对象数组。
E.g。
Plugin::Plugin() {
Plugin::plugins[Plugin::instances++] = *this;
}
这将复制Plugin对象,而不是引用您刚创建的对象。
编辑评论:你能否添加为什么{}实例化对象?
一组空括号,称为默认初始化,
8.5初始化程序默认初始化T类型的对象意味着:
- 如果T是数组类型,则每个元素都是默认初始化的;
然后对每个元素:
- 如果T是(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(12.1)...
基本上,每个元素都隐式调用空构造函数(默认值)。