在 class 中声明静态数组,并将大小传递给构造函数?
Declare static array in class with size passed to constructor?
有什么方法可以在 class 中声明静态数组,其大小已传递给构造函数?如果大小必须是 const 也没关系,这样就无法在运行时设置它。
我试过这样做:
class class_name
{
public:
float* map;
class_name(int n, const int d)
{
float arr[d];
map = arr;
}
};
但我觉得这可能是个非常糟糕的主意。不好吗?如果是,那为什么会这样?
'static array' 是指大小不变的东西吗? std::unique_ptr<float[]>
和 std::make_unique(std::size_t)
可能是一个选项。
是的,这个代码
class_name(int n, const int d)
{
float arr[d];
map = arr;
}
是个坏主意,有两个原因
float arr[d];
在堆栈中创建一个局部变量,因此它在块的末尾不复存在。所以 map
变成了悬空指针。如果您需要动态大小分配,您应该只使用 std::vector<float> map
并避免 lot 的麻烦。
float arr[d];
是变长数组,C++不支持。使 d
成为 const
没有帮助,它必须是一个实际常量,而不是 const
变量。
解决方案:既然你说数组长度可以在编译时确定,这非常适合模板:
template <std::size_t N>
class class_name
{
public:
std::array<float, N> map { {} }; // { {} } causes value initialization of everything to 0
// actually above could be `float map[N];` but it has the C array gotchas
class_name(int n)
{
// not sure what n is for...
}
};
并声明这个class的变量:
class_name<5> obj; // obj.map size is 5
有什么方法可以在 class 中声明静态数组,其大小已传递给构造函数?如果大小必须是 const 也没关系,这样就无法在运行时设置它。
我试过这样做:
class class_name
{
public:
float* map;
class_name(int n, const int d)
{
float arr[d];
map = arr;
}
};
但我觉得这可能是个非常糟糕的主意。不好吗?如果是,那为什么会这样?
'static array' 是指大小不变的东西吗? std::unique_ptr<float[]>
和 std::make_unique(std::size_t)
可能是一个选项。
是的,这个代码
class_name(int n, const int d)
{
float arr[d];
map = arr;
}
是个坏主意,有两个原因
float arr[d];
在堆栈中创建一个局部变量,因此它在块的末尾不复存在。所以map
变成了悬空指针。如果您需要动态大小分配,您应该只使用std::vector<float> map
并避免 lot 的麻烦。float arr[d];
是变长数组,C++不支持。使d
成为const
没有帮助,它必须是一个实际常量,而不是const
变量。
解决方案:既然你说数组长度可以在编译时确定,这非常适合模板:
template <std::size_t N>
class class_name
{
public:
std::array<float, N> map { {} }; // { {} } causes value initialization of everything to 0
// actually above could be `float map[N];` but it has the C array gotchas
class_name(int n)
{
// not sure what n is for...
}
};
并声明这个class的变量:
class_name<5> obj; // obj.map size is 5