1

私はこのようなプログラムを持っています:

class A {
  int a[2][3];
 public:
  A(int b[2][3]): a(b) {};
};

int main() {
  int b[2][3];
  A myclass(b);
  return 1;
}

コンパイラは次のように述べています。

1.cpp: In constructor 'A::A(int (*)[3])':
1.cpp:5:22: error: incompatible types in assignment of 'int (*)[3]' to 'int [2][3]'

なぜそれらは互換性がなく、配列 A::a を別の配列 b で初期化するにはどうすればよいですか?

4

2 に答える 2

3

歴史的な理由から、組み込みの配列型は、値によって関数にコピーまたは渡すことができない、かなり不便な 2 番目のクラスの型です。代わりに、それらはポインターに減衰する傾向があります。構文にもかかわらず、コンストラクターの引数は実際にはポインターであり、

A(int (*b)[3])

したがって、ポインターを配列に割り当てることができないというエラーメッセージが表示されます。

配列をクラスにラップして、より便利にコピー可能な型にすることができます。C++11 では、標準ライブラリは既にそのようなarrayテンプレートを提供しています:

typedef std::array<std::array<int,2>,3> array;
array a;
A(array const & b) : a(b) {}

組み込みの配列を使い続けたい場合は、Steam でデータをコピーする必要があります。

A(int b[2][3]) {std::copy(b, b+3, a);}    
于 2014-01-28T11:06:30.773 に答える
0

int a[2][3]基本的に定数ポインタです。定数ポインタには代入できません。完全なコンテンツのみをコピーできます。ポインターのみをコピーする必要がある場合は、配列の代わりにポインターを宣言する必要があります。

class A {
  int (*a)[3];
 public:
  A(int b[2][3]): a(b) {};
};
于 2014-01-28T11:01:54.763 に答える