2016-09-21 4 views
-2

を包む++、私は多くの行でエラーを返す次のコードを持っている:Cは、複数の戻り

bool func() 
{ 
    if (acondition) 
    { 
     return 0; 
    } 
    return 1; 
} 

int cmdfun() 
{ 
    other_funcs; 
    if (func()) return ERROR#NUMBER; 
    other_funcs; 
    if (func()) return ERROR#NUMBER; 
} 

をしかし、私はその長い長いなってきました。 return ERROR#NUMBERをfunc()にもカプセル化できますか?または、(func())がERRORを返す場合はカプセル化する方法もあります。別の独立した関数に?

+0

このケース用に設計された例外を使用しないのはなぜですか? –

+0

@πάνταῥεῖfunc() - > cmdfun() - > main()のような呼び出しスタックの戻り値をカプセル化することでfunc()はmain()に直接ERRORを返すことができるので、復帰させる必要はありませんcmdfun()のERRORです。 – cdnszip

+0

return__カプセル化できません代わりに前述の例外を使用してください。 –

答えて

0

私が言ったように、それは例外ではなく、stdで処理することはできない:例外、それは単なるエラーメッセージであり、エラー#NUMBERは単なる別のマクロです。そして私はcmdfun()の呼び出し側にアクセスできません。だから最初の答えを採用することができません。しかし、他の人に尋ねられた後は、それを入力するときにリターンをカプセル化して時間を節約することは可能ですが、これは推奨されませんが、この特定のケースではマクロを使用できます。完全な例を以下に示します。

#include <iostream> 
using namespace std; 

#define CHECK_VEC(acondition)\ 
if(checkcondition(acondition)) return -1; 

bool checkcondition(bool acondition) 
{ 
    if (acondition) return 1; 
    return 0; 
} 

int fun_called_by_main() 
{ 
    int a = 5 + 4; 
    bool acondition = a; 
    CHECK_VEC(acondition); 

    return 1; 
} 


int main() 
{ 
    int a = fun_called_by_main(); 

    cout << a << endl; 

    cin.get(); 
    return 0; 
} 
2

これは実際にreturnを使用して達成することはできません。

しかし、あなたでしthrowバブルアップコールスタック、方法であなたがするプログラム制御をしたいように見えるだろうfuncで例外:

int cmdfun() 
{ 
    other_funcs; 
    func(); 
    other_funcs; 
    func(); 
    /* don't forget to return something*/ 
} 

struct myexception{}; /*ToDo - inherit from std::exception?*/ 
bool func() 
{ 
    if (acondition){ 
     return 0; /*normal behaviour, perhaps make `func` void if not needed?*/ 
    } 
    throw myexception(); 
} 

cmdfunは、フォームをとります

最後に、への発信者の例外がcatchであることを確認してください。

-2

私はあなたの質問をcorectlyに理解していれば、あなた自身ののエラー報告者を求めています。

ケース1 - あなたはまだ「エラーレポーター」を作るためにreturnステートメントを使用したい::2つの独立したケースの2つのソリューションがあります

これを行うには、あなたは別の関数を作成する必要がありますか、単にgotoの使い方を学んでください。 0(偽)と1(真)

bool func() 
{ 
    if (acondition) 
    { 
     return (bool)0; // False (no error) 
    } 
    return (bool)1; // True (error) 
    // Note: I used (bool)0 and (bool)1 because it is 
    // more correct because your returning type is bool. 
} 

void errorcase(bool trueorfalse) 
{ 
    switch(trueorfalse) 
    { 
    case False: 
     ... // your code (func() returned 0) 
     break; 
    default: 
     ... // your code (func() returned 1) 
     break; 

     // Note that you will not need to check if an error occurred every time. 
    } 
    return; 
} 

int cmdfun() 
{ 
    ... // your code 
    errorcase(func()); 
    ... // again - your code 
    return 0; // I suppouse that you will return 0... 
} 

しかし、私は後者の場合だと思います: - あなたの関数はブール値(ブール値)を返します - あなただけの2つの可能な結果を​​持っていることを意味しかし、あなたがする必要はありません。 (不幸にも、初心者として理解するのが難しく、最初の解決策はあなたのほうがはるかに簡単かもしれません):ケース2 - あなたはそれを何か他の方法で行うことに決めました。それはスローとキャッチを学ぶことです。 @Bathshebaがpreety goodと答えたので、私は答えを繰り返さない。

+0

基本的にはcmdfun()という関数でERRORを返したいとします。 cmdfun()が直接呼び出す関数からのmain()は、func()です。スタックはfunc() - > cmdfun() - > main()ですが、func()をmain()に直接ERRORを返すようにします。 – cdnszip

+0

_ @ VVI CとC 15_ OPが間違ったツリーを樹立しないようにしましょう。あなたの回答者にはあまり価値はありません。 –