2012-02-19 7 views
3

コンパイルしてうまく動作するC++コードがありますが、私は助けが必要だと疑いがあります。 私はここの初心者ですので、私にご負担ください。これがコードです。コンストラクタのみ初期化時に、ではない通常の中に呼び出され、私の知る限り理解しfl(float val){ this->val = val; }オブジェクト割り当ての動作が混乱する

op_ovl_1.cxx: In function 'int main()':

op_ovl_1.cxx:15:12: error: no match for 'operator=' in 'var0 = 6.0e+0'

op_ovl_1.cxx:5:10: note: candidate is: fl& fl::operator=(const fl&)

op_ovl_1.cxx:17:12: error: no match for 'operator=' in 'var1 = 8.0e+0'

op_ovl_1.cxx:5:10: note: candidate is: fl& fl::operator=(const fl&)

:私は、このオーバーロードされたコンストラクタをコメントして

#include <iostream> 
using namespace std; 

//class float 
class fl { 
    float val; 
    public: 
    fl(){ val = 0.0; } 
    fl(float val){ this->val = val; } 
    float get_val(){ return val; } 
}; 

int main(){ 
    fl var0, var1; 
    var0 = 6.0; 
    cout << "var0.val after " << var0.get_val() << endl; 
    var1 = 8.0; 
    cout << "var1.val after " << var1.get_val() << endl; 
    return 0; 
} 

上記のコードは、しかし、このエラーをコンパイルしたレポートはありません私が間違っているなら、私を修正してください。それで、コンストラクタが通常の割り当てのために呼び出されるように見えるのは、いくらか混乱していませんか?

+1

このコードは、GCCとClangの上で私をうまくコンパイルします。どのコンパイラを使用していますか?また、コンストラクタは次のように書かれています: 'fl():val(0.0){}'と 'fl(float val):val(val){}' –

+0

@tenfour yv14i –

+0

ええ、コンパイルして正常に動作します。基本的な疑問はありましたが、なぜ私は過負荷になっていないときにコンパイルすべきですか?助けてくれてありがとう、btw。 – vikasC

答えて

1

flクラスのデフォルトの代入演算子を呼び出そうとしています。この演算子では、右辺の値が代入者と同じ型(この場合はfl)であることが予想されるため、失敗します。実際のコンストラクタを呼び出してfloat値を渡すか、自分の代入演算子を定義することができます(trojanfoeが答えたように)。私は元のオプションをお勧めします。

3

あなたがfl(float val)コンストラクタを離れる場合は、コンパイラは、varX変数にそれを割り当て、flオブジェクトにそれらのフロート定数を変換することができます。

このコンストラクタは変数varXではなく、割り当ての右側の定数で使用されます。

+0

ありがとうマット、私はあなたのポイントを持っていると思います。 – vikasC

0

タイプf1のオブジェクトにdoubleを割り当てようとしています。 valの値を変更する関数を使うか、var0.val = 6.0で修正することができます。

受信したエラーは、C++では異なる演算子を使用すると何が起こるかを変更できるためです。あなたのケースやソリューションのように、trojanfoeは、 '='演算子を使用してクラスの振る舞いを変更しています。

1

クラスを書くときは、 "rule of three"に従ってください。これは、デストラクタ、コピーコンストラクタ、および代入演算子を記述することを意味します。

あなたのクラスにコピーコンストラクタと代入演算子がありません!

あなたのクラスのより良い実装:

//class float 
class fl { 

    float val; 

public: 

    fl() : val(0.0f) {} 

    fl(float val) : val(val) {} 

    // copy constructor 
    fl(const fl& other) : val(other.val) {} 

    // assignment operator 
    fl& operator=(const fl& other) { val=other.val; return *this; } 

    float get_val() const { return val; } 

}; 

は、いくつかの他のグッズを注意してください、私は、この他にも、ここで;-)

を追加し、フロート定数は常に追加さ「F」を持っている必要があります。それ以外の場合は、タイプdoubleとして解釈されます。

関連する問題