如何在C ++类中声明动态大小的数组字段?

时间:2013-04-09 13:10:00

标签: c++ arrays oop 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

如何解决这个问题?

7 个答案:

答案 0 :(得分:3)

std::vector<double>。 C样式数组的大小必须是编译时常量。

答案 1 :(得分:2)

在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;
};

答案 2 :(得分:1)

int generators_count;
double mean_arr[generators_count];

初始化类时,generators_count没有值,这意味着您无法使用它来确定数组的大小。你能用std :: vector吗?

答案 3 :(得分:1)

使用vector或使用double*,然后使用new进行分配(仅当初始分配后大小不会改变时)

数组需要在编译时知道大小

答案 4 :(得分:1)

我建议使用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);

答案 5 :(得分:1)

如果在编译时知道generators_countintervals_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用于区间数据的建议 - 节省了向量的数量。 [我甚至可能在提出这个结构之前已经这样做了,因为它让生活更容易看到所有这些都属于一起]。

答案 6 :(得分:1)

好。第一个答案是:您应该尝试std::vector<double>.

但看着你的代码......你的意图是什么?

你的代码中的

ParsedData只是一个带有数据的实际数组的接口,并且你不是在ParsedData中复制任何更多的引用(实际指针),但数据在某处其他。这是你的意图吗?

如果是,您可以使用简单的double *maen_arr;等。

如果不是,并且您实际上需要数据的副本,请考虑使用vector