- ベストアンサー
No.799238の続き
listに構造体を格納するというのは確かに出来たのですが、 ヘッダーファイルとcppファイルに分けて書くときにはどうなるのでしょうか? 私がやってみると、ヘッダーファイルは、 classの中にorderの定義を書く: ・・・ class{ ・・・ struct order{ double price; double no; double quantity; }; list < struct order > B; list < struct order > ::iterator iteB; ・・・ } あるいは、 classの外にorderの定義を書く: ・・・ struct order{ double price; double no; double quantity; }; class{ ・・・ list < struct order > B; list < struct order > ::iterator iteB; ・・・ } いずれにおいてもコンパイル失敗しました。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
なぜここにきてclassがでてきたのかわかりませんが、 ヘッダーファイルをわける方法と classの中に構造体をいれる話は関係ありません。 とりあえず前のソースを無理矢理分けてみましたが、、、 *****ヘッダファイルtest.h***** #include <iostream> #include <cstdlib> #include <stdio.h> #include <list> #include <vector> using namespace std; struct order{ double price; double no; double quantity; }; class xxx{ public: list < struct order > B; list < struct order > ::iterator iteB; }; *****ソースファイルtest.cpp***** #include "test.h" void main() { xxx C; list < struct order > B; list < struct order > ::iterator iteB; struct order Player1={1.1,10.,0.9}; C.iteB=C.B.begin(); C.B.insert(C.iteB,Player1); struct order Player2={1.,11.,0.9}; double limit=Player2.price; C.iteB=C.B.begin(); if(C.B.size()>0){ while((*C.iteB).price>=limit && C.iteB!=C.B.end())iteB++; } } 普通クラスにするならpublicではなく privateにし、内部処理するメンバ関数をもたせます。
その他の回答 (3)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
list < struct order > B; ここでの<>に囲まれた「struct order」はテンプレート引数です。 list < struct <order> > B; となると、structという命令自体がテンプレート引数を持ち、 order型というテンプレート引数を受け取っているということに なってしまいます。 で、実際の例ですが listクラスは、ヘッダファイル「list」の中で、 template<class _Ty, class _A = allocator<_Ty> > class list { ・ ・ void push_back(const _Ty& _X) ・ ・ と宣言されています。(VC++6.0のヘッダファイルより) list<int> x; のように変数を宣言をすると、listのクラス定義やソースに含まれる _Tyがすべてintに置き換えられてコンパイルされます。 intがstruct orderになっても同じことです。 構造体だから、クラスだからということで何も変わりません。 list<int> x; の場合、 x.push_back( 0 ); x.push_back( 1 ); x.push_back( 2 ); とすることで、listの最後に要素が追加されていきます。 ここでlist<int>クラスがpush_backメソッドから受け取っているのは あくまでも値のみ(実際には参照が)です。 となると、当然次のソースも問題ありません。 int i = 0; x.push_back( i ); i++; x.push_back( i ); i++; x.push_back( i ); 呼び元の変数iがどこのアドレスで領域が確保されていようが 知ったこっちゃないということです。 ようは、変数内の値のみがlistには格納されているということです。 listは、_Ty型の値を内部で管理しているということです。 で、ここでintをstruct orderに変えてみて何が変わるか? ということです。 はっきりいって、listは何も変わりません。 intの時と同様、 list<struct order> x; で、_Tyがstruct orderに置き換えられ、コンパイルされるだけです。 もちろんintのときと変わらないんですから、 struct order i = {0, 0}; x.push_back( i ); i.a = 1; i.b = 10; x.push_back( i ); i.a = 2; i.b = 20; x.push_back( i ); これで何も問題はありません。 listのpush_backメソッドには、値を渡すだけでいいのですから。 で、ここが本題なのですが、 以前、ibm_111さんはnewしてdeleteにこだわっていましたよね。 newして確保した領域を破棄してはいけない例を次に示します。 list<struct order *> x; struct order * p; p = new strunct order; p->a = 0; p->b = 0; x.push_back( p ); //delete p; p = new strunct order; p->a = 1; p->b = 10; x.push_back( p ); //delete p; p = new strunct order; p->a = 2; p->b = 20; x.push_back( p ); //delete p; こうした場合は、それぞれnewで確保したpを破棄してはいけません。 この場合は、listで管理しているのはstruct t *であるので、 構造体のアドレスのみを管理しているからです。 そのアドレスが指し示すstruct tのメンバの値まではlistが 管理をしていないため、deleteしてはいけないわけです。 ibm_111さんがdeleteにこだわったのは、list(以前はvector)で 管理している内容が、newで確保した領域そのものだという 思いからだという気がするんですけど、違いますか?
お礼
ありがとうございました。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>>テンプレートがなんだか理解されてますか? > >だいたい理解しましたが、実際に使ってみたことはありません。 なにを言ってるんですか。 ibm_111さんが使っているlistやvector、 これこそテンプレートで作成されたライブラリである STLこと標準テンプレートライブラリです。 しっかり使ってるじゃないですか。 >テンプレートの理解と構造体の格納がどのようにつながるのか分かりません。 厳しいことを言いますが、テンプレートを理解することが できない限り、STLを使いこなすことはできません。 list < struct order > B; まさか、この記述、<>に囲まれた「struct order」が ただのクラスの引数だなんて思ってないですよね。
お礼
訂正します。 >>テンプレートがなんだか理解されてますか? > >だいたい理解しましたが、実際に使ってみたことはありません。 だいたい理解しましたが、自分でテンプレートを作ったことはありません。 >まさか、この記述、<>に囲まれた「struct order」が >ただのクラスの引数だなんて思ってないですよね。 いや、思ってます。それ以上の意味があるのですか?
- taka_tetsu
- ベストアンサー率65% (1020/1553)
横やりですけど・・・ >listに構造体を格納する テンプレートがなんだか理解されてますか? いろいろと試行錯誤されているようですが、 まず基本から理解したほうがいいと思いますよ。 前の質問では、 list < struct <order> > B; というテンプレートを理解していれば絶対にしない記述をされているので心配なのですが。 http://okweb.jp/kotaeru.php3?q=791495 でも結局途中で締め切ってしまったようですし。 で、 >いずれにおいてもコンパイル失敗しました。 #includeの記述の仕方が正しくないだけでしょう。 おそらく。 sha-girlさんの回答のように、ヘッダファイル内に必要な#includeを書いておけばいいかと。
お礼
ありがとうございます。 >テンプレートがなんだか理解されてますか? だいたい理解しましたが、実際に使ってみたことはありません。 しかし、 >list < struct <order> > B; >というテンプレートを理解していれば絶対にしない >記述をされているので心配なのですが。 テンプレートの理解と構造体の格納がどのようにつながるのか分かりません。 「~をvector、listに格納する」という意味のコードに対する 私の統一的な理解はまだ完成していません。
お礼
ようやくできました。ありがとうございました。