0

私は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

それを修正する方法はありますか?

4

7 に答える 7

3

std::vector<double>. C スタイルの配列のサイズは、コンパイル時の定数でなければなりません。

于 2013-04-09T13:12:15.070 に答える
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;
};
于 2013-04-09T13:14:03.470 に答える
1
int generators_count;
double mean_arr[generators_count];

クラスを初期化するとき、generators_count には値がありません。つまり、それを使用して配列のサイズを決定することはできません。代わりに std::vector を使用できますか?

于 2013-04-09T13:14:12.847 に答える
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);
于 2013-04-09T13:21:19.517 に答える
1

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個人的には、ジェネレーターの値を保持するためにa を使用し、間隔データに別の a を使用するという提案が好きですstruct- ベクトルの数を節約します。[これらすべてが一緒に属していることが分かりやすくなるため、この構造を思いつく前に、おそらくそうしていたでしょう]。

于 2013-04-09T13:28:52.273 に答える
1

良い。最初の答えは次のとおりです。試してみてくださいstd::vector<double>.

しかし、あなたのコードを見て…あなたの意図は何ですか?

ParsedDataあなたのコードのように、データを含む実際の配列への一種のインターフェースにすぎず、ParsedData でそれへの参照 (実際にはポインター) 以外のものをコピーしていませんが、データは別の場所にあります。これはあなたの意図ですか?

はいの場合は、simpledouble *maen_arr;などを使用できます。

いいえ、実際にデータのコピーが必要な場合は、 の使用を検討してくださいvector

于 2013-04-09T13:31:08.820 に答える