- ベストアンサー
boostスマートポインタ(shared_ptr)を使用した、簡単なファイルの読み込みとループ処理で困っています。
- boostスマートポインタ(shared_ptr)を使って、テキストファイルから情報を読み取って構造体のvectorを作成しようとしています。
- ファイル読み込みの過程で'>'を認識し、構造体の領域を作成し、それ以外の行を格納するベクターに入れたいと考えています。
- しかし、実際には'>'で始まる名前の行しか出力されません。原因や解決方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「ベクターへのpush_back」はできていますし, 「shared_ptrの扱いに根本的な間違いがある」わけでもありません. はっきりいえば, 「それ以前の問題」です. 本質的には int a, *b; b = new int; *b = 5; a = *b; *b = 4; としたときに「a と *b が同じ値にならない」と悩んでいるのと同じです. あと, いろんなところで「同じ名前の変数」を定義しているので, その結果として「どの変数がどこで可視なのか」が混乱しているようにも見えます. //'/'で始まる行を格納しておくベクター領域の作成 boost::shared_ptr<vector<string>> SMARTptr_vector_of_string(new vector<string>); で定義した SMARTptr_vector_of_string は, //この行をstring格納用のベクター(if(buf[0]=='>') ですでに作られている)に入れる (*SMARTptr_vector_of_string).push_back(buf); では見えないし有効でもありません.
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
このプログラムにおいてポインタを使う意味はほとんどありません. 特に, '>' で始まる行の処理のうち //'/'で始まる行を格納しておくベクター領域の作成 boost::shared_ptr<vector<string>> SMARTptr_vector_of_string(new vector<string>); //構造体に作成されたベクターを入れる (*SMARTptr_my_struct).vector_of_string = *SMARTptr_vector_of_string; の部分は完全に無意味で, ない方がよほどましです. もうちょっというと //構造体の領域を作成 boost::shared_ptr<my_struct>SMARTptr_my_struct(new my_struct); の部分も有効ではありません. ベクタを vector<boost::shared_ptr<my_struct> > で定義していればいいのですが, 現状では「ポインタとしての値」を代入してなんかするということがないので shared_ptr を使う必然性がありません. むしろ my_struct *ptr_my_struct = new my_struct; なら「まだ」わからなくもないです... が, 「まだ」レベルであってやはり意味があるとは思えないなぁ. '>' で始まる行の処理はもっと単純に my_struct theStruct; theStruct.name = buf; vector_of_my_struct.push_back(theStruct); で終わらせて, '/' で始まる行に対しては vector_of_my_struct.rbegin()->vector_of_string.push_back(buf); とすればいい.
お礼
いろいろとアドバイスありがとうございました。 問題のプログラムは、結局スコープに気をつけつつ、構造体のベクターをつくり、構造体を毎回指定して呼び出すことで解決しました。
- Tacosan
- ベストアンサー率23% (3656/15482)
それほど単純じゃないですよ~. #1 の前半が何をさしているのか, 理解できていますか~?
補足
やはりポインタの振る舞いやスコープの理解が決定的に不足していることを痛感しました。自分のコーディングが悪い、というのは分かってきたのですが、それでどう書けばいいというのが思いつきません。 一から勉強して出直してきますと言うべきところなのですが、「こうした方がいい」というような方法、方向性だけでも教えていただけないでしょうか。
お礼
>で定義した SMARTptr_vector_of_string は, >//この行をstring格納用のベクター(if(buf[0]=='>') ですでに作られている)に入れる >(*SMARTptr_vector_of_string).push_back(buf); >では見えないし有効でもありません. (if(buf[0]=='/'){}のブロックのpush_backは (if(buf[0]=='>'){}で作ったベクターではなく、 whileループの外側ではじめにつくっていたベクターに入れられていたわけですね。で、(if(buf[0]=='>'){} のブロックのベクターには何も入れられていないので出力がないということのようです。 スコープが全く理解できていなかったようです。 (if(buf[0]=='>'){}の部分でほかのブロックからも可視になるように(グローバル変数?)ベクターを作ってやれば よさそうです。 ありがとうございました。