2011-11-19 24 views
0

私は、次のコードに問題があります。CPP戻り参照

IntegerSet& IntegerSet::unionOfIntegerSets(IntegerSet a){ 

    IntegerSet result; 

    for (int i = 0; i < 100; i++){ 
     if ((array[i] == 1) || (a.getElement(i) == 1)){ 
       result.setElement(i, 1); 
     } 
    } 
    return result; 
} 

エラーは以下のとおりです。[デフォルトで有効になって]返さローカル変数「結果」に

  • 参照を

  • オーバーロードされた 'IntegerSet()'の呼び出しはあいまいです

私が間違っていることを教えてもらえますか?ありがとうございました!

ヘッダファイル:

#ifndef INTEGERSET_H_ 
#define INTEGERSET_H_ 

class IntegerSet{ 
private: 
    int* array; 

public: 
    IntegerSet(); 
    IntegerSet(int, int, int, int, int); 
    ~IntegerSet(); 

    int getElement(int); 
    void setElement(int, int); 

    IntegerSet& unionOfIntegerSets(IntegerSet); 
    IntegerSet insertionOfIntegerSets(IntegerSet); 
    void setPrint(); 

}; 


#endif 

これを回避する方法は何ですか?

EDIT

IntegerSet IntegerSet::unionOfIntegerSets(IntegerSet a){ 

    IntegerSet result; 

    for (int i = 0; i < 100; i++){ 
     if ((array[i] == 1) || (a.getElement(i) == 1)){ 
       result.setElement(i, 1); 
     } 
    } 
    return result; 
} 

エラーがある:オーバーロードされたの

  • コール 'IntegerSetは()' が言うように、最初のエラーが正確である
+0

あなたは、2番目のエラーが発生したラインを提供してもらえますか? – Shahbaz

答えて

4

あいまいです。ローカル変数への参照を返しています。

resultがスタックに宣言されます。関数が終了した後には死ぬでしょうから、それへの参照が無効でぶら下がります。

第2のエラーについては、あいまいさがどこにあるかを見るためにIntegerSetクラスの定義を見る必要があります。

EDIT:また、クラスのコピーコンストラクタも定義する必要があります。

EDIT 2:さて、私はそれを考え出したと思う:

二コンストラクタのあなたの定義は次のようになりますか?

IntegerSet::IntegerSet(int a = 0, int b = 0, int c = 0, int d = 0, int e = 0){ 

} 

私はこれを試しました。あなたが持っているあいまいなオーバーロードコールがあります。

この場合、パラメータを指定しないでコンストラクタを呼び出すと、どちらかのコンストラクタ呼び出しが行われる可能性があります。したがって、あいまいさが発生します。だから、それをやるべきことは、最初のパラメータのデフォルト値を取り除くことです。

+0

これにはどのような回避策がありますか? – TGM

+0

最も簡単な方法は、値で返すことです。 – Mysticial

+0

考えられる回避策:1)IntegerSet(参照ではない)を返す、2)unionOfIntegerSetが呼び出されたオブジェクトを変更する、または3)結果を格納できるunionOfIntegerSetにオブジェクトを参照(またはポインタ)で渡す。 –

0

メソッドを終了した直後に破棄されるローカル変数への参照を返すことはできません。値で返すようにしてください。

2

ローカル変数を返す際の問題は、関数の実行中にスコープ/有効であるということです。関数が完了すると、スタックフレームが破棄され、その値について何も保証することはできませんメモリ。

2

最初のエラーは、前述のとおり、ローカル変数への参照を返すためです。参照をポインタの下に置くと、ローカル変数への参照を保持することになります。つまり、unionOfIntegerSetsが終了した後に、が終了し、スタック上の変数が返されます。だから、コンパイラはあなたにそれをしないように言って大きな賛成をしています。

あなたは中間結果を持っている場合は、それらの結果は、あなたの戻り値は同じ名前の他の機能を持っていて、あるため、あなたの2番目のエラーがあるタイプIntegerSetないIntegerSet &

のものでなければならないことを意味する、コピーする必要がありますそれをどこかから呼び出す。関数を呼び出すときに渡す引数の型は、関数のオーバーロードの少なくとも2つにキャストされる可能性があります。そのため、コンパイラは2つ(またはそれ以上)の関数のうち実際に意味するものを理解できません。あなたが呼び出す場合

int func(short int a); 
int func(int a); 

char c = 'c'; 
int res = func(c); 

C++はshort intintの両方にcharをキャストすることができますので、理解することはできませんが、あなたがその上の任意のコードが与えられていないので、私はあなたの例を与えます2つのうちのどちらを呼び出すかを選択します。

さらにコードを提供すれば、私はあなたがそれをピン止めするのを助けることができます。

3

ローカル変数への参照を返すことはできません。関数が終了すると、変数はなくなります。完全なコピーを返すか、またはこれに変更する必要があり、その関数を参照して変数 "result"を渡す必要があります。

void IntegerSet::unionOfIntegerSets(IntegerSet a, IntegerSet &result){ 

     for (int i = 0; i < 100; i++){ 
      if ((array[i] == 1) || (a.getElement(i) == 1)){ 
        result.setElement(i, 1); 
      } 
     } 
    } 
関連する問題