如何在C++类中声明动态大小的数组字段
How to declare dynamically sized array fields in C++ class?
我是C++新手。
我想要一个有5个数组作为字段的类。这些数组的大小应该动态初始化。
我已经写了一些代码,但这不起作用
class ParsedData {
public:
int generators_count;
double mean_arr[generators_count];
double variance_arr[generators_count];
int amount_of_numbers_to_generate_arr[generators_count];
int intervals_count;
double interval_begins_arr[intervals_count];
double interval_ends_arr[intervals_count];
};
ParsedData::ParsedData(int _generators_count, double[] _mean_arr, double[] _variance_arr, int[] _amount_of_numbers_to_generate_arr,
int _intervals_count, double[] _interval_begins_arr, double[] _interval_ends_arr) {
generators_count = _generators_count;
mean_arr = _mean_arr;
variance_arr = _variance_arr;
amount_of_numbers_to_generate_arr = _amount_of_numbers_to_generate_arr;
intervals_count = _intervals_count;
interval_begins_arr = _interval_begins_arr;
interval_ends_arr = _interval_ends_arr;
}
编译错误日志:
z01.cpp:53:9: error: invalid use of non-static data member ‘ParsedData::generators_count’
z01.cpp:54:21: error: from this location
z01.cpp:53:9: error: invalid use of non-static data member ‘ParsedData::generators_count’
z01.cpp:55:25: error: from this location
z01.cpp:53:9: error: invalid use of non-static data member ‘ParsedData::generators_count’
z01.cpp:56:43: error: from this location
z01.cpp:57:9: error: invalid use of non-static data member ‘ParsedData::intervals_count’
z01.cpp:58:32: error: from this location
z01.cpp:57:9: error: invalid use of non-static data member ‘ParsedData::intervals_count’
z01.cpp:59:30: error: from this location
z01.cpp:62:56: error: expected ‘,’ or ‘...’ before ‘_mean_arr’
z01.cpp:62:1: error: prototype for ‘ParsedData::ParsedData(int, double*)’ does not match any in class ‘ParsedData’
z01.cpp:51:7: error: candidates are: ParsedData::ParsedData(const ParsedData&)
z01.cpp:51:7: error: ParsedData::ParsedData()
z01.cpp: In function ‘ParsedData load_input_data()’:
z01.cpp:102:62: error: no matching function for call to ‘ParsedData::ParsedData(int&, double [(((sizetype)(((ssizetype)generators_count) + -1)) + 1)], double [(((sizetype)(((ssizetype)generators_count) + -1)) + 1)], int [(((sizetype)(((ssizetype)generators_count) + -1)) + 1)], int&, double [(((sizetype)(((ssizetype)intervals_count) + -1)) + 1)], double [(((sizetype)(((ssizetype)intervals_count) + -1)) + 1)])’
z01.cpp:102:62: note: candidates are:
z01.cpp:51:7: note: ParsedData::ParsedData()
z01.cpp:51:7: note: candidate expects 0 arguments, 7 provided
z01.cpp:51:7: note: ParsedData::ParsedData(const ParsedData&)
z01.cpp:51:7: note: candidate expects 1 argument, 7 provided
有办法解决这个问题吗?
std::vector<double>
。C样式数组的大小必须是编译时常数。
在C++中,您将使用std::vector<double>
,并在构造函数中将其初始化为所需的大小。例如:
#include <vector>
class Foo
{
public:
Foo(int i) : intervals_count(i), interval_begins_arr(intervals_count) {}
private:
int intervals_count;
std::vector<double> interval_begins_arr;
};
我建议使用std::vector
,如下所示。
class ParsedData {
std::vector<double> mean_arr, variance_arr, interval_begins_arr, interval_ends_arr;
std::vector<int> amount_of_numbers_to_generate_arr;
ParsedData(std::vector<double> mean_arr,
std::vector<double> variance_arr,
std::vector<double> interval_begins_arr,
std::vector<double> interval_ends_arr,
std::vector<int> amount_of_numbers_to_generate_arr)
: mean_arr(mean_arr), variance_arr(variance_arr)
, interval_begins_arr(interval_begins_arr), interval_ends_arr(interval_ends_arr)
, amount_of_numbers_to_generate_arr(amount_of_numbers_to_generate_arr) {}
}
您可以使用将c++数组或指针转换为向量
int count = 5;
int a[count] = {1, 2, 3, 4, 5};
std::vector<int> vec_a(a, a+5);
int generators_count;
double mean_arr[generators_count];
初始化类时,generatorscount没有值,这意味着您不能使用它来确定数组的大小。你能用std::vector代替吗?
使用vector
或使用double*
,然后使用new
进行分配(仅当初始分配后大小不会改变时(
数组需要在编译时已知大小
如果generators_count
和intervals_count
在编译时是已知的[但不是整个程序的一个常数],则可以使用template
。
template <const int T1, const int T2>
class ParsedData {
public:
int generators_count;
double mean_arr[T1];
double variance_arr[T1];
int amount_of_numbers_to_generate_arr[T1];
int intervals_count;
double interval_begins_arr[T2];
double interval_ends_arr[T2];
};
否则,如其他地方所建议的,请使用vector
。
我个人喜欢使用struct
来保存生成器值,使用另一个struct
来保存区间数据的建议,这样可以节省向量的数量。[我可能在提出这个结构之前就已经这样做了,因为这让人们更容易看到所有这些都属于一起]。
好吧。第一个答案是:你应该试试std::vector<double>.
但看看你的代码…你的意图是什么?
代码中的ParsedData
只是到具有数据的实际数组的一种接口,您不会在ParsedData中复制对它的引用(实际上是指针(,而是数据在其他地方。这是你的意图吗?
如果是,您可以使用简单的double *maen_arr;
等
如果没有,并且您实际上需要一份数据副本,那么请考虑使用vector
。
- 将位字段导出到数组
- 结构字段名称与 GDB 中的 STL 数组冲突
- 结构数组中所有类似字段的总和
- 如何使用函数的输出初始化 const 数组结构字段?
- 如何使用连接器 c++ 在 mySQL 表二进制(16) 字段中存储 c++ 字节数组?
- 在类中定义数组的方法和字段
- 指向结构中的数组的指针,其中每个字段都是一个动态数组
- 在C++中使用 RapidJSON 访问 JSON 数组的字段
- 无法从JNI设置Java Int数组字段
- 将具有不同字段的结构转换为 uint8 的数组
- 如何使用指向该数组的指针访问结构数组中包含的结构中的字段?[C++]
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 在一个结构中,使用一个数组字段访问另一个是否合法
- 构造函数将数组字段设置为 null
- CIN 一个非常大的 int 数组,段故障 11
- 从c++到c#的包含数组字段的结构体的封送数组
- c++创建新数组导致段错误
- 类静态数组字段突然更改值(C++)
- 如何在C++类中声明动态大小的数组字段
- 数组>字段[名称] 或数组>字段[ "name" ]