- 締切済み
C++での戻り値について
C++で以下のソースを書きました。 どうしてaaaは問題ないのにbbbはだめなのかがわかりません。 どちらも、func1()、func2()で設定した文字列・vectorのポインタを返したいです。 int main() { const char* aaa = NULL; std::vector<const char*>* bbb = NULL; aaa = func1(); bbb = func2(); } const char* func1() { const char* str = NULL; str = "test"; return str; } std::vector<const char*>* func2() { std::vector<const char*>* str2 = NULL; str2->push_back("test2"); str2->push_back("test3"); return str2; } 現在必要に迫られてC++勉強中です。よろしくお願いいたします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
>func1、func2は同じように書いているのに、 あなたが「同じように書いている」と思っているだけで、実際には違うからです。 func1の str = "test"; に該当するヶ所はfunc2のどこにありますか? 先にいっておきますが str2->push_back("test2"); str2->push_back("test3"); は該当ヶ所ではありません。
- m-take0220
- ベストアンサー率60% (477/782)
> ポインタの型がcharとvectorで違うだけで動きが違っていて func1の場合、strにNULLを設定後、"test"が保持されているポインタを代入しています。 func2の場合、str2にNULLを設定しただけで、その後何も代入せずにvectorの機能を使用しようとしています。 ポインタの型だけでなく、使い方も違っています。 func1のほうを strcpy(str, "test"); にすると、動作しなくなります。
- titokani
- ベストアンサー率19% (341/1726)
#3です。 >呼び元に帰ったvector 実行したのは、本当に質問文に書いてあるのと同じソースでしょうか? 質問文のソースだと、呼び出し元には返ることなく、例外を吐いて終了すると思うのですが。 コンパイラ、実行時のOSは何でしょうか? あと、メッセージ等は出力されていないでしょうか。
- titokani
- ベストアンサー率19% (341/1726)
>どうしてaaaは問題ないのにbbbはだめなのかがわかりません。 だめなのはbbbではなくてfunc2のほうだと思います。 そもそも「だめ」の一言で済ませているのがよくない。 具体的にどのような現象が起きているのかを考えるようにしないと上達しないですよ。 さしあたり、 std::vector<const char*>* str2 = NULL; この行がよくありません。 newを使って実体を確保しましょう。
- Gotthold
- ベストアンサー率47% (396/832)
> ->でpush_backすれば大丈夫だと思っていました、、 そもそもNULLに対してpush_backなんてできないですよね。 str2はNULLなんだからNULL->push_backってやってるのと同じようなもの。
補足
ご回答ありがとうございます。 ビルド時に未初期化のエラーになってしまったので、「=NULL」をつけてしまいました。 たしかにNULLには詰められませんね。。
- wormhole
- ベストアンサー率28% (1626/5665)
「func2()で設定したvectorのポインタを返したいです」とは書かれていますが、func2()内のstr2に設定されているのはNULLで、 str2->push_back("test2"); str2->push_back("test3"); は機能しないからです(func2()でvectorのポインタなんて設定していない)。
補足
早速のご回答ありがとうございます。 ->でpush_backすれば大丈夫だと思っていました、、 push_backで詰めたvectorのポインタを呼び出し元に返すにはどのように書けば良いでしょうか。
補足
ご回答ありがとうございます。 func1、func2は同じように書いているのに、ポインタの型がcharとvectorで違うだけで動きが違っていて、なぜなのか理解できておりません。。 なかなか結果を的確に説明できず(知識不足が原因だと思いますが)、ざっくりとした表現になってしまいました。。 呼び元で受け取って、それをconst char*を引数に持つ別の関数に渡す必要があり、うまくできないものかと試行錯誤していました。 複数必要なパターンが出てきたので、vectorで詰めて、呼び元でループでひとつずつ処理していこうとおもっていましたが、呼び元に帰ったvectorがサイズ0になっていて、詰めたものはどこにいったのかわかりませんでした。