[解決済み] オブジェクトポインタの配列の作成 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);
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み] コンテナには、オブジェクト全体とオブジェクトへのポインタのどちらを格納すべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む