2016-09-03 6 views
2

これはC++(Eclipse Mars、重要な場合はMinGWコンパイラ)です。 スコープ付き変数を関数内から変更するにはどうすればよいですか?

int strParse(const string& a) { 
    // parse line read input 
    int b = a.find("-"); 
    firstsplit = a.substr(0, b); 
    secsplit = a.substr(b + 1); 
    return 0; 
} 

しかし、私はないグローバル変数としてではなく、その彼ら main()の範囲内 firstsplitsecsplitを定義したい:のは、私は文字上の2つの文字列に文字列を分割し、機能を使用したいとしましょう再使用されます。そこに定義されているときは、関数内で使用することはできませんが、 mainの部分で使用するために関数を定義する必要があります。

+0

@なぜ 'main'の変数を関数で使うことができないのでしょうか?(もちろん引数として渡すことを意味します) – KostasRim

+0

文字列を関数に渡す必要があるため、関数に文字列を入力したり、関数の中からペアのようなものを渡す必要があります。 – NathanOliver

答えて

9

確かにそれらをmain()で定義し、参照によって渡すことができます。しかし、それはうんざりです。

この状況を分析する場合は、firstsplitsecsplitが関数の計算対象となります。

したがって、関数が行うべきことは、これらの値を返すことです。これは関数が大事にしていることです。何かを計算して返します。

これを行うには、std::pairを返すだけです。

std::pair<std::string, std::string> strParse(const string& a) { //parse line read input 
    int b = a.find("-"); 
    std::string firstsplit = a.substr(0, b); 
    std::string secsplit = a.substr(b + 1); 
    return std::make_pair(firstsplit, secsplit); 
} 

しかし、あなたの機能はまた、このようなエラー表示として、何か他のもの、またはいくつかの他の代替結果を返す必要があります場合、これはより多くの仕事になり、そしてより多くの書き換えでしょう。あなたがここに戻された追加情報のいずれかの種類が、これは単にparse_resultsクラスに追加することができます持っている必要がある場合は、次に

class parse_results { 

public: 

    std::string firstsplit; 
    std::string secsplit; 
}; 

parse_results strParse(const string& a) { //parse line read input 
    parse_results ret; 

    int b = a.find("-"); 
    ret.firstsplit = a.substr(0, b); 
    ret.secsplit = a.substr(b + 1); 
    return ret; 
} 

:関数がクラスを返すようにするために

最も柔軟なアプローチがあります。

+0

このような素晴らしい例(upvoted)。個人的には、2つ以上の文字列を返す可能性があるので、戻り値の型として 'ベクトル'を使用します。 – KostasRim

+2

@KostasRimそうではありません。またはOPが 'std :: tuple'を使っている場合、C++で出てくる構造化バインディングを使用することができます。 – NathanOliver

+0

@ NathanOliver私はC++ 17の追加に精通していません。指摘してくれてありがとうございます。 – KostasRim

0

は、私がメインで2 std::stringを宣言して、関数の引数として渡すためにあなたをお勧めします int型strParse(定数文字列&、文字列& firstsplit、文字列& secsplit)

+2

これに 'downvote'がなぜないのか分かりません。しかし、私はそれがexpnationの不足のためだと思う。 – sjsam

+5

@sjsam説明がなく、フォーマットが貧弱なため投票が遅れているようです(下位有権者ではない) – NathanOliver

1

を試してみてください。それがあなたが探している動作ではない場合は、関数をstd::vector<string>に戻すことができます。

string::find()メソッドがsize_tを返し、intではないことを指摘したいと思います。タイプが不明な場合は、常にautoを使用できます。

0

int戻り値は無駄です。それは常に0です。代わりに、2つの文字列を2つの要素、つまりstructまたはstd::arrayに返してください。

関連する問題