1

私はこれに似たクラスを持っています:

class Krzyzowka
{
    protected:
    char model[40][40];
    int x, y;

    public:
        Krzyzowka() { }

            Krzyzowka(char model[][40], int x, int y)
            {
                this->model=model;
            }
};

ここで、main() で次のように宣言します。

char array[10][10];

そしてそれをに渡したい:

Krzyzowka(char model[][40], int x, int y)

私はこのようにしています:

Krzyzowka obj(array, 10, 10);

しかし、渡された配列でモデルの 2D 配列を設定したいと思います。

this->model=model;

ただし、コンパイラは次の 2 つのエラーを返します。

error: no matching function for call to ‘Krzyzowka::Krzyzowka(char [10][10], int, int)’

error: incompatible types in assignment of ‘char (*)[40]’ to ‘char [40][40]’

どうすればこれを正しく行うことができますか? 助けてくれてありがとう。

4

2 に答える 2

2

パラメータchar model[][40]は のような配列にのみ使用できますparameter[x][40]

本当に行配列をメソッドに渡したい場合は、ポインターを使用できます。

class Krzyzowka
{
    protected:
        char **pp_model;
        int x, y;

    public:
        Krzyzowka() { }

        Krzyzowka(char **pp_model, int x, int y)
        {
            this->pp_model = pp_model;

            // do not miss follow two line
            this->x = x;
            this->y = y;
        }
};

次に、をchar **使用する代わりに、パラメータを渡してオブジェクトをインスタンス化できますchar array[x][y]

そして今、あなたが使用していますc++。行配列は使用しない方がよいでしょう。それはだ。代わりに stl ベクトルを使用できます。

お役に立てますように:)

于 2012-05-11T07:51:26.127 に答える
0

アレイを別のアレイに自動的に割り当てる操作はありません。

考えられる回避策:


nrowsループを使用して、内部配列にデータを手動でコピー割り当てします (有効なと を追跡してくださいncols)。コンパイラの苦情を回避するために、テンプレートを使用できます (コンパイル時にサイズがわかっていると仮定します)。

    template<int NROWS, int NCOLS>
    Krzyzowka(char (&model)[NROWS][NCOLS])
    {
        nrows = NROWS > nrows ? nrows : NROWS;
        ncols = NCOLS > ncols ? ncols : NCOLS;
        for (int row = 0; row < nrows; row++)
          for (int col = 0; col < ncols; col++) 
            this->model[row][col] = model[row][col];
    }

これで、次のようなオブジェクトを作成できます。

char array[][2] = {{'a', 'b'}, {'c', 'd'}};
Krzyzowka k(array);

配列の次元が実行時にしかわからない場合 (たとえば、ユーザー入力に基づいておりchar** array、ネストされたによって動的に割り当てられている場合)、ここでnew[]示した方法を採用するか、次の方法に切り替える必要があります。


std::vectorさらに良いのは、 (スワップまたは代入できる)のような標準的な配列型を使用することです。そうすれば、コンパイラの型の非互換性の苦情にも問題はありません。

std::vector<std::vector<char> > array(nrows, std::vector<char>(ncols));
std::vector<std::vector<char> > model;
model = array; // or model.swap(array); if you don't need the copy
于 2012-05-11T07:34:16.403 に答える