4

混乱しています。以下はコード スニペットです。

andを使用して 5 つのクラス オブジェクトの動的配列を作成したいのnewですが、ループ カウンターを使用してコンストラクターの最初のパラメーターを割り当てるループを実行したいと考えています。何かのようなもの。

class A {
    public:
        A(int _x, int _y):x(_x),y(_y) {}
    private:
        int x,y;
};

int main() {
    A* a = new A[5];   //compiler error
    for(i=0;i<5;i++) {
        a[i] = A(i, 10);
    }
}

単純なコンストラクターがないので、これを行うための正しい構文を教えてください。

4

6 に答える 6

7

この行

A* a = new A[5];

Aデフォルトで構築可能である必要があります。したがって、簡単なオプションは、デフォルトのコンストラクターを次のように追加することですA

 A(): x(), y() {} // zero-initializes x and y

C++ では、通常std::vector<A>、この場合に an を使用することを好むことに注意してください。newすべてのメモリ管理に対応するため、 and をdelete明示的に呼び出す必要はありません。また、動的にサイズを変更することもできます。これにより、std::vector<A>デフォルトで構築された 5 つのAオブジェクトで が構築されます。

std::vector<A> a(5);

ただし、おそらく空のものを作成し、ループで値をプッシュする必要があります。

std::vector<A> a;
for(i=0;i<5;i++) {
    a.push_back(A(i, 10));
}
于 2013-03-15T12:27:48.863 に答える
3
A* a = new A[5]; 

クラスに存在しないデフォルトのコンストラクターを使用して、5型のオブジェクトを構築しようとします。あなたはそれを実装する必要があります:AA

class A {
    public:
        A() : x_(0), y_(10) { }                 // default constructor
        A(int x, int y) : x_(x), y_(y) { }
    private:
        int x_;
        int y_;
};

std::vectorただし、この動的に割り当てられた配列の代わりに使用する方が良いことに注意してください。

std::vector<A> a(5);

また、デフォルトのコンストラクターを使用して5型のオブジェクトを構築Aします:)

于 2013-03-15T12:35:09.127 に答える
1

パラメータを取らないコンストラクタがないため、次のいずれかを実行できます。

A(int _x = 0, int _y = 0):x(_x),y(_y) {}

または

A() : x(0), y(0) {}

そして for ループ書き込みの代わりに

for(i=0;i<5;i++) {
    a[i].set(i, 10);
}

適当な方法でset

于 2013-03-15T12:29:32.343 に答える
0

次の 2 つのオプションがあります。

  • A** a = new A*[5]とを使用しますa[i] = new A(i, 10)。つまり、Aオブジェクトの配列ではなく、へのポインターの配列です。

  • または、デフォルトのコンストラクターを含めるA(): x(0), y(0) {}か、既存のコンストラクターにデフォルトのパラメーターを追加するだけです。

現在のコンパイラ エラーは、new A[5]5 つの連続した s をビルドAし、そのためにメモリのバイトを割り当て、デフォルト コンストラクター(パラメーターのないコンストラクター)5 * sizeof(A)の 5 倍を呼び出すためですが、このデフォルト コンストラクターはクラス A では使用できません。A

于 2013-03-15T12:29:31.770 に答える
0

ここでの問題は、デフォルトのコンストラクターがないことです。new を呼び出すと、何らかの方法でオブジェクトを作成する必要があり、作成できませんでした。C++11 がオプションの場合は、1 つ (つまり、初期化してゼロを使用するもの) を提供するか、x初期y化子リストを使用する必要があります。

于 2013-03-15T12:29:48.293 に答える