2

クラスT、クラスM(抽象クラ​​ス)、クラスMC(コンテナー)、クラスAC(MCコンテナーに追加される特定のオブジェクトを作成する)およびメインファイルの5つのファイルがあります。オブジェクト(この場合はAC)を追加し、AC(タイトル)で見つかったデータメンバーを取得するためのこれらの関数があります。

プログラムがコンパイルされ、ACオブジェクトを作成して追加できるようです。ただし、GetTitle関数を使用しようとすると、プログラムがクラッシュし、次のエラーが発生します。

「TLab5.exeの0x00b938e6で未処理の例外:0xC0000005:アクセス違反の読み取り場所0xcccccce4。」</ p>

私が調べたところ、これは不良/初期化されていないポインタがあることを意味します。私のプログラムの唯一のポインタはこれです:

 M *C[MCSize] //Found in MC.h

MCのコンストラクターは次のようになります。

 MC::MC()
 {
cout << "Enter Name: ";
getline(cin, CName);

cout << "Enter size of collection: ";
cin >> CurrentMCSize;
if (CurrentMCSize < 0 || CurrentMCSize > MCSize)
{
    cout << "Size is invalid. Please re-enter: ";
    cin >> CurrentMCSize;

 }; //MCSize is defined in the header of MC.

入力されたタイトルを呼び出す関数は次のとおりです。

 void MC::ListMTitles()
 {
      for (int i = 0; i < CurrentMCSize; i++)
      {
         cout << i << ". " << Collection[i]->GetTitle();
      }
 };
 //GetTitle is defined in M.cpp

DMAが発生する場所://MC.cpp

 void MC::AddM()
 {
int Selection;
if(CurrentMCSize < MCSize)
{
    DisplayMTypeMenu();
    Selection = GetMTypeSelection();
    switch(Selection)
    {
    case 1: Collection[CurrentMCSize] = new AC;
    break;
    // Other case statements

    }
    if (0 == Collection[CurrentMCSize])
    {
        cout << "Error: Memory Allocation Failed.";
        exit(1);
    }
    else
    {
        cout << "New M Type added!" << endl << endl;
    }
    CurrentMCSize++;
}

ポインタを正しく初期化していませんか?私の追加機能は実際に私に嘘をついていて、何も追加されていませんか?私は周りを見回しましたが、私が見たほとんどの答えはベクトルを使用することでした。このプロジェクトのために、教授がそれらを調べなかったので、私は使用を許可されていないと思います。

4

2 に答える 2

2

構築中にコレクションのサイズを入力するようにユーザーに求めていますが、コレクションのこれらの要素にデータを入力することはありません。次に、を呼び出すとAddM、から継続しCurrentMCSizeます。代わりに、コンストラクターでゼロに初期化する必要がCurrentMCSizeあり、まったく要求しないでください。

于 2012-12-19T18:49:12.667 に答える
1

これが原因で問題が発生します

  for (int i = 0; i < CurrentMCSize; i++)
  {
     cout << i << ". " << Collection[i]->GetTitle();
  }

0から開始しますが、AddM()が0から追加を開始するという保証はありません。

void MC::AddM()
{
int Selection;
if(CurrentMCSize < MCSize)
{
    DisplayMTypeMenu();
    Selection = GetMTypeSelection();
    switch(Selection)
    {
    case 1: Collection[CurrentMCSize] = new AC;

代わりに、CurrentMCSizeが4のようにコンストラクターに供給される可能性があるものを追加します。追跡する3つの個別の値があります。サポートされる最大サイズ、現在使用されているサイズ、およびアイテムを割り当てる次のスロットですが、最後の2つを1つの変数にまとめました。

関連する質問-単にstd::vectorとpush_backを使用したくない理由はありますか?

編集:ああ、私はそれを見ませんでした、パディはそれに私を打ち負かしました。

于 2012-12-19T18:59:11.803 に答える