こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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++勉強中です。よろしくお願いいたします。

投稿日時 - 2016-09-22 23:49:11

QNo.9232962

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

>func1、func2は同じように書いているのに、

あなたが「同じように書いている」と思っているだけで、実際には違うからです。
func1の
str = "test";
に該当するヶ所はfunc2のどこにありますか?

先にいっておきますが
str2->push_back("test2");
str2->push_back("test3");
は該当ヶ所ではありません。

投稿日時 - 2016-09-23 19:16:46

ANo.5

> ポインタの型がcharとvectorで違うだけで動きが違っていて

func1の場合、strにNULLを設定後、"test"が保持されているポインタを代入しています。

func2の場合、str2にNULLを設定しただけで、その後何も代入せずにvectorの機能を使用しようとしています。

ポインタの型だけでなく、使い方も違っています。

func1のほうを

strcpy(str, "test");

にすると、動作しなくなります。

投稿日時 - 2016-09-23 13:12:50

ANo.4

#3です。
>呼び元に帰ったvector
実行したのは、本当に質問文に書いてあるのと同じソースでしょうか?
質問文のソースだと、呼び出し元には返ることなく、例外を吐いて終了すると思うのですが。
コンパイラ、実行時のOSは何でしょうか?
あと、メッセージ等は出力されていないでしょうか。

投稿日時 - 2016-09-23 11:17:59

ANo.3

>どうしてaaaは問題ないのにbbbはだめなのかがわかりません。
だめなのはbbbではなくてfunc2のほうだと思います。
そもそも「だめ」の一言で済ませているのがよくない。
具体的にどのような現象が起きているのかを考えるようにしないと上達しないですよ。

さしあたり、
std::vector<const char*>* str2 = NULL;
この行がよくありません。
newを使って実体を確保しましょう。

投稿日時 - 2016-09-23 10:11:42

補足

ご回答ありがとうございます。

func1、func2は同じように書いているのに、ポインタの型がcharとvectorで違うだけで動きが違っていて、なぜなのか理解できておりません。。

なかなか結果を的確に説明できず(知識不足が原因だと思いますが)、ざっくりとした表現になってしまいました。。
呼び元で受け取って、それをconst char*を引数に持つ別の関数に渡す必要があり、うまくできないものかと試行錯誤していました。
複数必要なパターンが出てきたので、vectorで詰めて、呼び元でループでひとつずつ処理していこうとおもっていましたが、呼び元に帰ったvectorがサイズ0になっていて、詰めたものはどこにいったのかわかりませんでした。

投稿日時 - 2016-09-23 10:43:41

ANo.2

> ->でpush_backすれば大丈夫だと思っていました、、
そもそもNULLに対してpush_backなんてできないですよね。
str2はNULLなんだからNULL->push_backってやってるのと同じようなもの。

投稿日時 - 2016-09-23 09:23:37

補足

ご回答ありがとうございます。
ビルド時に未初期化のエラーになってしまったので、「=NULL」をつけてしまいました。
たしかにNULLには詰められませんね。。

投稿日時 - 2016-09-23 10:36:34

ANo.1

「func2()で設定したvectorのポインタを返したいです」とは書かれていますが、func2()内のstr2に設定されているのはNULLで、
str2->push_back("test2");
str2->push_back("test3");
は機能しないからです(func2()でvectorのポインタなんて設定していない)。

投稿日時 - 2016-09-23 03:17:46

補足

早速のご回答ありがとうございます。
->でpush_backすれば大丈夫だと思っていました、、
push_backで詰めたvectorのポインタを呼び出し元に返すにはどのように書けば良いでしょうか。

投稿日時 - 2016-09-23 08:56:12

あなたにオススメの質問