0

誰かが関数(メイン関数以外)でオブジェクトの配列を作成するために何をする必要があるか教えてもらえますか?

ある種の例を作って説明しようと思います...

クラスSchedule.hを実装するTimeScheduler.cppという名前のプログラムがあるとしましょう(そして、メソッドを定義する別のファイルSchedule.cppに実装があります)。

宣言ファイルでは、2つのコンストラクターを宣言しました

  Schedule(); //the default

  Schedule(int, int, int);//accepts three arguments

要点を理解するために、たとえばメインプログラムファイルTimeScheduler.cppで、Scheduleクラスから継承された関数とは別に、このプログラムで独自の関数を作成したとします。そのため、プロトタイプが一番上に表示されます。

 /*prototypes*/

  void makeSomeTime();

等.....

我々は持っています

 main(){ 


//etc etc...
 }

次に、これらのプログラム関数を定義します

    void makeSomeTime(){
      //process
    }

関数makeSomeTime()内で、次のようなScheduleオブジェクトの配列を作成するとします。

    Schedule ob[]={ 
       summer(5,14, 49), 
       fall(9,25,50)
    };

このオブジェクトの配列を作成できるようにするには、関数makeSomeTime()に対して何をする必要がありますか。私が尋ねる理由は、現在、main()でこのオブジェクトの配列を作成できるという点で、自分のプログラムに問題があるためです。ただし、例を示したような関数ではできません。奇妙なことに、関数内にオブジェクトの動的配列を作成できるようになります。

   Schedule *ob = new Schedule[n+1];
   ob[2]= Schedule(x,y,z);

main()で非動的配列に割り当てられるのに、関数で割り当てられないのはなぜですか?

4

2 に答える 2

2

これは正しくありません:

 Schedule ob[]={ 
       summer(5,14, 49), 
       fall(9,25,50)
    };

あなたは3つの新しい名前を導入しようとしているようです:

  1. ob、これはScedulesの配列です
  2. summer、 これはSchedule
  3. fall、 これはSchedule

summerそのfallような新しい名前として紹介することはできません。おそらくこれは単なるタイプミスであり、あなたは次のことを意味していました。

Schedule ob[]={ 
   Schedule(5,14, 49), 
   Schedule(9,25,50)
};

...これは完全に問題なく、次のような関数に存在する可能性があります。

void make_schedule()
{
    Schedule ob[]={ 
       Schedule(5,14, 49), 
       Schedule(9,25,50)
    };
}

しかし今、あなたは別の問題を抱えています-あなたのmake_schedule関数はを返しますvoid。で作成したSchedule配列が作成され、破棄されmake_scheduleます。関数から配列を返したい場合は、を使用してそれを返すのが最善vectorの方法です。

std::vector<Schedule> make_schedule()
{
    Schedule ob[]={ 
       Schedule(5,14, 49), 
       Schedule(9,25,50)
    };

    const size_t num_obs = sizeof(ob)/sizeof(ob[0]);
    std::vector<Schedule> ret;
    std::copy( &ob[0], &ob[num_obs], std::back_inserter(ret));

    return ret;
}

より貧弱な代替策は、動的割り当てを使用して配列を割り当て、最初の要素へのポインターを返すことです。この場合、使用するときnew []は、デフォルトのコンストラクターしか使用できないことに注意することが重要です。

于 2012-06-18T21:39:54.347 に答える
0

ベクトルを使用する代わりに、unordered_mapを使用できると判断しました。C ++でオブジェクトに「名前を付ける」とき、実際には名前を付けていないことに気づきませんでした...それは単に一種の一時的な参照として使用されます。名前を使用する場合は、セット内のキー値の一種として名前を使用することをお勧めします。お気に入り:

文字列foodname;

foodname="ケーキ";

[食品名、10.95]

foodname="パン";

[食品名、5.75]

http://msdn.microsoft.com/en-us/library/bb981993.aspxでunordered_mapのヘルプを見つけました

于 2012-06-19T13:29:00.257 に答える