1. ホーム
  2. c++

[解決済み] オブジェクトポインタの配列の作成 C++

2022-03-04 14:08:59

質問

多くのオブジェクトへのポインタを保持する配列を作りたいのですが、保持するオブジェクトの数が事前に分からないので、配列のために動的にメモリを確保する必要があります。次のようなコードを考えてみました。

ants = new *Ant[num_ants];
for (i=1;i<num_ants+1;i++)
{
    ants[i-1] = new Ant();
}

ここで ants は次のように定義されます。 Ant **ants;Ant はクラスです。

うまくいくのでしょうか?

どのように解決するのですか?

<ブロッククオート

うまくいくのか?

はい。

ただし、可能であればベクターを使用すること。

#include <vector>

std::vector<Ant*> ants;
for (int i = 0; i < num_ants; ++i) {
    ants.push_back(new Ant());
}

もし、動的に割り当てられた配列を使用しなければならないのであれば、この構文が好ましいと思います。

typedef Ant* AntPtr;
AntPtr * ants = new AntPtr[num_ants];
for (int i = 0; i < num_ants; ++i) {
    ants[i] = new Ant();
}

しかし、そんなことは忘れてください。このコードでは、手動でメモリ管理をする必要があるため、まだ良いとは言えません。これを解決するには、コードを次のように変更すればよいでしょう。

std::vector<std::unique_ptr<Ant>> ants;
for (auto i = 0; i != num_ants; ++i) {
    ants.push_back(std::make_unique<Ant>());
}

そして何より素晴らしいのは、シンプルにこれだけでしょう。

std::vector<Ant> ants(num_ants);