C++ 如何定义作为不可实例化类的静态成员的数组的大小?

C++ 如何定义作为不可实例化类的静态成员的数组的大小?,c++,arrays,c++11,static,compile-time-constant,C++,Arrays,C++11,Static,Compile Time Constant,我正在编写一个不想实例化的类。它的所有成员都是静态的。此类表示微控制器的外围设备。因为在微控制器中只有一个外设实例,所以创建该类的实例对我来说没有意义。该类仅对该外围设备的数据和功能进行分组 类的数据成员之一是一个数组,该数组的大小应由类的用户在编译时定义。如果我可以创建这个类的对象,我知道我可以初始化构造函数的初始值设定项列表中的常量,但是我真的不想创建这个类的实例。也许我可以使用模板并将数组大小设置为模板参数,但我需要为每个成员调用使用类似于my_class::do_something()的

我正在编写一个不想实例化的类。它的所有成员都是静态的。此类表示微控制器的外围设备。因为在微控制器中只有一个外设实例,所以创建该类的实例对我来说没有意义。该类仅对该外围设备的数据和功能进行分组

类的数据成员之一是一个数组,该数组的大小应由类的用户在编译时定义。如果我可以创建这个类的对象,我知道我可以初始化构造函数的初始值设定项列表中的常量,但是我真的不想创建这个类的实例。也许我可以使用模板并将数组大小设置为模板参数,但我需要为每个成员调用使用类似于
my_class::do_something()
的内容。有没有更简单的方法来解决这个问题?我想让我的课变成这样:

class my_class
{
private:
    static const int _size;
    static int _array[_size];
public:
    static void array_size(int size) { _size = size; }
    static void do_something() { /* .... */ } 
};

您的主要要求是在编译时设置数组大小。在编写C++时,通常会避免使用C-ISH,但在您的情况下,使用宏(如

)可能更有意义。
#define ARRAY_SIZE 
... somewhere in your class ...
static int array_name[ARRAY_SIZE];

你最好的选择可能是一个好的老定义

下面是我将如何构造它(使用名称空间,因为这是执行仅静态类的惯用方法):

h:

namespace peripheral {
  void do_something();
}
peripheral.cpp:

#ifndef PERIPH_ARRAY_SIZE
#  error "please define the size of array"
#endif

namespace {
  int _array[PERIPH_ARRAY_SIZE];
}

namespace peripheral {
  void do_something() {...}
}

允许用户设置大小的一种方法是将数组更改为向量。因为它是私人的,所以你可以控制它的使用方式。一个简单的bool将限制是否对其进行一次大小调整,并确保其确实进行了大小调整:

class my_class
{
private:
    static const int _size = 10;
    static vector<int> _array;
    static bool arraySized;
public:
    static void array_size( int size = _size ) 
    {
        if ( !arraySized )
        {
            _array = vector<int>( size );
            arraySized = true;
        }
    }
    static void do_something() 
    {
        if ( arraySized )
        {
            /* .... */
        }
    }
};
class my\u class
{
私人:
静态常数int_size=10;
静态矢量阵列;
静态布尔阵列化;
公众:
静态空数组大小(整数大小=\u大小)
{
如果(!阵列化)
{
_数组=向量(大小);
数组化=真;
}
}
静态void do_something()
{
如果(阵列化)
{
/* .... */
}
}
};
虽然不是在编译时,但它确实具有相同的效果

需要考虑的其他几件事是,使用基于模板的方法可以创建该类的多个实例。这会打破你想要的奇点原理

using my_class = my_class_impl<10>;

using my_class2 = my_class_impl<20>;
int main() {
    my_class::do_something();
    my_class2::do_something();
}
使用my_class=my_class\u impl;
使用my_class2=my_class2\u impl;
int main(){
我的班级::做点什么();
我的课堂2::做点什么();
}

另一件事是,最新的Atmel框架确实包含向量的标题。您引用的信息必须已过期。

请考虑使用用constepr数组大小参数化的类模板,然后创建别名:

#include <array>

template <std::size_t Size>
class my_class_impl {
private:
    static constexpr std::size_t size = Size;
    static std::array<int, Size> arr;
public:
    static void do_something() { /* .... */ }
};

template <std::size_t Size>
std::array<int, Size> my_class_impl<Size>::arr;

using my_class = my_class_impl<10>;

int main() {
    my_class::do_something();
}
#包括
模板
类我的类\u类\u impl{
私人:
静态constexpr std::size\u t size=size;
静态std::阵列arr;
公众:
静态void do_something(){/*../}
};
模板
std::array my\u class\u impl::arr;
使用my_类=my_类\u impl;
int main(){
我的班级::做点什么();
}

< /代码>如果在编译时设置了大小,那么什么是<代码>静态空隙数组大小(int size){size size=size;}应该做什么?考虑一个单独的类。与普通的旧静态数据相比,它有一些优势。@n.m.,你能说得更多吗?实际上我现在正在使用宏,但这个类将是库的一部分。我想让用户在编译时用代码来定义数组的大小,而不是使用DayRaySub大小标志。(使用单例类而不是静态成员)你能说更多吗?我不知道如何实现一个单体。我也不知道这个方法的优点是什么,而不是我的静态成员。这个答案显示了如何实现一个单体:谢谢,但是我没有C++的STD库是我正在工作的平台。如果你没有C++的STD库,哪个库AR?你在使用吗?我在编程Atmel AVR微控制器。没有那个平台的官方C++库。所以,假设你使用Atmel Studio,你应该能够使用C++中的任何一个STD库。向量是C++ STD库的一部分。