5

これは課題の一部ですが、説明を求めています。

プログラムの起動時に、ATM.txtからデータをロードし、動的配列(STLではなくATMタイプ)に格納します。

STLなしで動的配列を実行するにはどうすればよいですか?おそらく割り当てはポインタを使用することを意味していると思いましたが、「ATMタイプ」は私を失望させました。

それは再び言及されています:

動的配列にaccounts.txtをファイルします(STLではなくアカウントタイプ)

-割り当ての一部ではありません

最初の行からファイル内のアイテムの数を取得するなど、メモリの安全でない操作の使用を理解したことはありません。

例えば。

5
abc
def
hij
kml
mno

STL(ベクトル、またはC ++ 11配列)を使用し、ファイル内の数値に依存しない方が賢明ではないでしょうか。正確ではないため、バッファオーバーフローなどが発生する可能性があります。

//編集データメンバー(顧客ID、BSB番号など)を含むファイルAccount.hにクラスアカウントを定義します。

アカウントとATMのタイプはそれらのクラスだと思います。

4

5 に答える 5

4

動的配列の最も基本的な形式は、を使用して作成され、 :new[]を使用して破棄されるものです。delete[]

ATM * atms = new ATM[count];
// do stuff with the array
delete [] atms;

ただし、これにより、配列を使用するコードが例外をスローしたり、関数から戻ったり、その他の方法での発生を妨げたりする危険性がありますdelete[]。その場合、割り当てられたメモリへの唯一のポインタが失われ、割り当てられたままになりますが、アクセスできなくなります。これはメモリリークとして知られています。このため、次のように配列をクラスでラップすることをお勧めします。

  • 配列へのポインタと(オプションで)そのサイズを格納するためのメンバー変数
  • 配列を割り当てるコンストラクターや関数
  • 配列を削除するデストラクタ
  • (オプションで)配列のサイズを変更する関数

オブジェクトのデストラクタで割り当てを削除するには、RAIIの原則を使用して、配列が不要になったら確実に削除します。

これにより、もう1つの危険が残ります。この配列オブジェクトをコピーすると、2つのオブジェクトが同じ配列を削除しようとすることになり、これは悲惨なことです。これを防ぐには、三つのルールを検討する必要があります。コピーコンストラクターとコピー代入演算子を記述して、新しい配列を割り当て、内容をコピーします。またはそれらを削除します。(昔ながらのC ++を学習している場合は、メンバー関数を削除できないため、メンバー関数をプライベートとして宣言する必要があり、代わりに実装しないでください)。

STLを使用する方が賢明ではないでしょうか。

通常、はい。ただし、C ++を学習している場合は、メモリ管理がどのように機能するか、およびライブラリにそれを処理させる方法を理解することをお勧めします。それはおそらくこの演習のポイントの一部です。

于 2012-08-22T16:16:31.957 に答える
1

この種の割り当ての一般的なアプローチは、ベクターの自動拡張動作を独自にシミュレートすることです。ヒープ上のデータに配列を割り当て、その長さと配列に格納したアイテムの数を追跡します。

配列にデータを入力したら、最大サイズをある程度拡張して、新しい配列を割り当てます。これにより、古い配列から新しい配列にデータをコピーし、再びスペースがなくなるまでアイテムを追加し続けることができます。

于 2012-08-22T16:02:12.557 に答える
0

STL (ベクトル、または C++11 配列) を使用し、ファイル内の数値に依存しない方が賢明ではないでしょうか?正確ではない可能性があり、バッファー オーバーフローなどを引き起こす可能性があります。

std::vector の内部は魔法ではありません。std::vector が行うことを手動で行うことができます。

それが、この課題であなたがすべきことのように思えます。ATM.txt ファイルからデータを安全に読み取ることができる「ATM タイプ」と、accounts.txt ファイルからデータを保持できる「アカウント タイプ」を作成します。おそらく、これらの型がどのように設計/使用されることを期待しているかについて、割り当てを書いた人から明確にする必要があります。また、クラスの資料を振り返ると、動的配列の使用に関して知っておくべきことがわかるはずです。

于 2012-08-22T16:14:45.687 に答える
-1

これは宿題なので、直接答えたくはありませんが、一般的に私が提案するのは次のとおりです。

  1. クラスを myDynamicArray にする
  2. 配列サイズを格納するために、クラスに int または long を含めます。
  3. 「new」を使用して配列にメモリを割り当てます。割り当てから、それは文字列の配列のように見えますが、教授が STL を厳密に禁止している場合 (文字列は現在 STL と見なされています)、文字配列の配列になります。
  4. 挿入する前に配列のサイズ (#2 を参照) をチェックし、十分な大きさでない場合は大きくする挿入メソッドを作成します。これはC++クラスであるため、C++以前の関数を使用せずにこれを行う1つの方法は、より大きなサイズの新しい配列を割り当てることです->古い配列からデータをコピーします->新しいデータを挿入します。どれくらい大きい?たとえば、新しい割り当てごとに 20% 大きくすることができます。Microsoft の C# は、要素の「次に大きい素数」を割り当てますが、非常に高速なメモリ割り当てルーチンを備えています。
  5. 動的配列を使い終わったら、忘れずに delete() してください (「完了」が何を意味するかは、割り当てによって異なります)。プログラムが終了すると、技術的にはメモリは自動的に解放されるはずですが、自分で解放しないのは非常に悪い習慣です (定期的にシャットダウンされない大規模で非学術的なプログラムを考えてください)。

別のユーザーが提供したテンプレート コードは避けたいと思います。確かに素晴らしいコードですが、初期の C++ クラスで進歩したものを使用することに眉をひそめるでしょう。

推奨読書: http://www.cplusplus.com/doc/tutorial/dynamic/

于 2012-08-22T16:20:01.067 に答える