如何在类中使用常量类变量声明常量数组?可能吗。 我不想要动态数组。
我的意思是这样的:
class test
{
const int size;
int array[size];
public:
test():size(50)
{}
}
int main()
{
test t(500);
return 0;
}
上面的代码给出了错误
答案 0 :(得分:5)
不,这是不可能的:只要size
是动态变量,array[size]
就不可能实现为静态数组。
如果您愿意,可以这样考虑:sizeof(test)
必须在编译时知道(例如,考虑test
的数组)。但是在您的假设示例中sizeof(test) == sizeof(int) * (1 + size)
,这不是编译时已知的值!
您可以将size
变为模板参数;这是唯一的解决方案:
template <unsigned int N>
class Test
{
int array[N];
static const unsigned int size = N; // unnecessary really
public:
// ...
};
用法:Test<50> x;
请注意,现在我们有sizeof(Test<N>) == sizeof(int) * (1 + N)
,其中 实际上是编译时已知值,因为对于每个N
,Test<N>
是 distinct 类型。
答案 1 :(得分:2)
你的意思是固定大小的数组?您可以像这样使用std::array
:
#include <array>
class test
{
static const size_t s_size = 50;
std::array<int, s_size> m_array;
public:
test()
{
}
};
或者,如果您想支持不同的尺寸,您需要使用这样的类模板:
#include <array>
template <size_t SIZE>
class test
{
std::array<int, SIZE> m_array;
public:
test()
{
}
};
std:array
还有一个额外的好处,就是可以将大小信息与成员一起保存(与衰减到指针的数组不同),并且与标准库算法兼容。
Boost还提供了一个类似的版本(boost::array)。
答案 2 :(得分:1)
您的代码会产生错误,因为编译器需要知道每个成员的数据类型的大小。当您编写int arr[N]
成员类型arr
是“N个整数数组”时,N
必须在编译时知道编号。
一种解决方案是使用枚举:
class test
{
enum
{
size = 50
};
int arr[size];
public:
test() {}
};
另一个是将size声明为类的静态const成员:
class test
{
static const int size = 50;
int arr[size];
public:
test(){}
};
请注意,只允许对静态类整数进行类内初始化!对于其他类型,您需要在代码文件中初始化它们。