Arduino / C ++:初始化类构造函数之外的静态对象数组

时间:2016-01-08 14:59:42

标签: c++ arrays arduino

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

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链是否可行?

1 个答案:

答案 0 :(得分:3)

使用指向数组中Plugin个对象的指针而不是实际的Plugin个对象!这将允许您对数组进行零初始化,然后在您去的时候为您的派生对象指定指针。

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

E.g。

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

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

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

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

  

8.5初始化程序默认初始化T类型的对象意味着:
     - 如果T是数组类型,则每个元素都是默认初始化的;

然后对每个元素:

  

- 如果T是(可能是cv限定的)类类型(第9节),则调用T的默认构造函数(12.1)...

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