包含不同大小静态数组的类的多个实例
Multiple instances of a class containing different-sized static arrays
我需要有一个类的多个实例。每个实例都应包含一个预定义大小的数组。数组的大小是恒定的,并且在编译时可用,因此我想静态分配它们。
我必须将实例收集在一个"对象数组"中,以便我可以使用迭代器访问它们。我的问题:
- 使用构造函数参数的静态分配不起作用。
- 循环中对象的实例化不起作用。
下面是我想做的一个示例代码:
//Class definition of buffer
class mybuffertype{
public:
mybuffertype(int size);
int bufsize;
float *buffer;
};
//Constructor of buffer
mybuffertype::mybuffertype(int size){
bufsize=size;
buffer=new float[bufsize]; //Dynamic allocation
//float buffer[bufsize]; //This static allocation doesn't work
}
//Class definition of container
class container{
public:
container();
static const int n_buffers=3;
const int n_sizes[n_buffers]={4,5,6};
mybuffertype mybuffers[n_buffers];
};
//Constructor of container
container::container(void){
int i;
for(i=0;i<n_buffers;i++){
mybuffertype mybuffers[i]= mybuffertype(n_sizes[i]);
}
}
//Main
int main(void){
container obj;
int i;
for(i=0;i<obj.n_buffers;i++){
printf("Size: %d t 1st element: %fn",
obj.mybuffers[i].size,
obj.mybuffers[i].buffer[0]);
}
}
最好的方法是什么?
从大小的编译时列表中,可以创建(异类大小(缓冲区的集合。
template <size_t... Sizes>
class Container
{
std::tuple<std::array<double, Sizes>...> buffers;
public:
template<size_t I>
gsl::span<double> get() { return std::get<I>(buffers); }
// etc.
};
通过运行时索引访问缓冲区稍微棘手一些。如果您不在数据指针中包含大小,请将gsl::span<double>
切换为double*
。
template <size_t... Sizes>
class Container
{
std::tuple<std::array<double, Sizes>...> buffers;
std::array<gsl::span<double>, sizeof...(Sizes)> lookup;
template <size_t... Idxs>
array<gsl::span<double>, sizeof...(Sizes)> make_lookup(std::index_sequence<Idxs...>)
{
return { get<Idxs>(buffers)... };
}
public:
Container() : lookup(make_lookup(std::index_sequence_for<Sizes...>{})) {}
template<size_t I>
gsl::span<double> get() { return std::get<I>(buffers); }
gsl::span<double> operator[](size_t i) { return lookup[i]; }
// etc.
};
您正在将静态概念与实例化混合在一起。不能在构造函数中实例化静态数组或类。
你可以做这样的事情:
#include <cstdio>
using namespace std;
//Class definition of buffer
class mybuffertype{
public:
mybuffertype(int size) {
bufsize=size;
buffer=new float[bufsize]; //Dynamic allocation
}
virtual ~mybuffertype() {
delete buffer;
}
int bufsize;
float *buffer;
};
class StaticData {
public:
StaticData(int n_buffers): n_buffers(n_buffers) {
mybuffers = new mybuffertype*[n_buffers];
for (int i = 0; i < n_buffers; ++i)
mybuffers[i] = new mybuffertype(3+i);
}
virtual ~StaticData() {
for (int i = 0; i < n_buffers; ++i)
delete mybuffers[i];
delete [] mybuffers;
}
const int n_buffers;
mybuffertype **mybuffers;
};
//Class definition of container
class MyContainer{
public:
static StaticData buffers;
};
StaticData MyContainer::buffers(3);
//Main
int main(int argc, char ** argv){
for(int i = 0; i < MyContainer::buffers.n_buffers; i++){
printf("Size: %d t 1st element: %fn",
MyContainer::buffers.mybuffers[i]->bufsize,
MyContainer::buffers.mybuffers[i]->buffer[0]);
}
return 0;
}
所有静态缓冲区都在一个新的类StaticData
中,该类只会调用构造函数一次,因为它在 MyContainer 中声明为静态。StaticData
还利用了类的 C++11 数组初始化。
相关文章:
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 如何在模板函数中实例化其长度使用模板参数的数组
- 从函数中全局删除并重新实例化数组结构,而无需在编译时知道数组的大小
- 我可以初始化 const 实例,以便我可以将其用作 const 来初始化数组吗?
- 结构数组的构造函数错误,错误消息:没有构造函数实例与参数列表匹配
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 如何为包含另一个类实例的数组制作常量 getter?
- 是否允许使用初始值设定项列表将const数组引用实例化为构造函数参数
- 如何创建具有不同字符数组的多个类实例?
- 包含不同大小静态数组的类的多个实例
- 如何在C++中动态分配全局字符数组中的类实例?
- 我可以从initializer_list实例化数组吗?
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- std::在类包装器实例化时设置的数组大小
- 如何通过循环访问数组来读取和存储实例的值?
- 分割故障 - 遇到问题,创建新的数组实例
- 无法用const char *数组实例化模板
- 数组、构造函数和实例
- 类C++的静态(单实例)数组
- 将2D数组的实例分配给3D数组中的索引