1

したがって、コンストラクターに渡された 2 つのパラメーターで初期化したい 2D 配列を持つクラスがある場合、どうすればよいでしょうか?コンストラクター。

--コメントからの更新:

私のヘッダーファイルでは、両方を試しました

int array[][] 

int **array 

そして、私がやろうとしているコンストラクターの.cppファイルで

array = new int[arg1][arg2]

ヘッダー ファイル内の配列のどちらの宣言も機能しませんでした。

4

3 に答える 3

4

コンストラクターで、 array = new array [arg1][arg2]を実行しようとしています

次のように配列タイプを指定する必要があります

array = new int[arg1][arg2];

これは C++11 でのみ機能することに注意してください。古い標準を使用する場合、2 番目の配列サイズは const である必要があります (これはおそらく必要なものではありません)。

同じ問題について議論している追加の記事もいくつかあります。

理想的には、とにかく C++ を使用しているためstd::vector、別の回答で提案されているとおりに使用する必要があります。

ただし、ベクトルは多くのオーバーヘッドを使用しますね。私は記憶の使用を軽く保つようにしています。–</p>

から始めstd::vectorます。機能的な観点からアプリケーションが適切に実行されたら、メモリ使用量やパフォーマンスにまだ懸念がある場合は、ベンチマークを実行してください。2D 配列をクラスに適切にカプセル化すると、それを使用するコードに影響を与えることなく、配列の実際の実装をいつでも変更できます。


技術的には、配列を含む 1 つのフラットなメモリ領域があることを確認したい場合は、次のコードのように、1 次元配列を使用して 2 次元配列をシミュレートできます (アイデアを得るために、確かにいくつかの改善が必要です。特に、コピー構築と代入演算子が欠落しています):

class Array2D {
private:
    int *array;
    int size1;

public:
    Array2D(int arg1, int arg2) {
        size1 = arg1;
        array = new int[arg1 * arg2];
    }

    ~Array2D() {
        delete[] array;
    }

    int& at(int i1, int i2) {
        return array[i1 * size1 + i2];
    }
};

int main() {
    Array2D array(10, 10);

    array.at(2, 2) = 42;
    std::cerr << array.at(2, 2);

    return 0;
}
于 2013-06-07T07:45:34.753 に答える
0

最も簡単な解決策は次のとおりです。

std::vector<std::vector<VALUE>> arr2(X, std::vector<VALUE>(Y));
于 2013-06-07T07:47:57.027 に答える
0

Andreas Fester の例に基づいて、境界チェックとカスタム型を使用した 2 次元配列の例を次に示します。

#include <stdexcept>

template <typename T>
class Array2D {
private:
    T *array;
    unsigned int sizeX;
    unsigned int sizeY;

public:
    Array2D(unsigned int X, unsigned int Y) {
        sizeX = X;
        sizeY = Y;
        array = new T[X * Y];
    }

    ~Array2D() {
    delete[] array;
    }

    T& at(unsigned int X, unsigned int Y) {
        if((X > sizeX) || (Y > sizeY))
            throw std::out_of_range("Bla bla");

        return array[X * sizeX + Y];
    }
};

int main() {
    double MyValue;
    Array2D<double> *MyArray = new Array2D<double>(10, 100);
    MyArray->at(1,1) = 10.1;
    MyValue = MyArray->at(1,1);
    printf("Array value = %3.3f\n", MyValue);

    return 0;
}
于 2019-07-25T14:54:32.573 に答える