2016-04-28 12 views
-3

算術演算子(+、 - 、*、/)とstd :: maxがオーバーロードされた新しい変数型(NewType)を実装しています。算術演算子は動作しますが、max関数には問題があります。誰かが私が紛失していることを指摘してくれますか?C++でmaxの演算子オーバーロード

#include <iostream> 
using namespace std; 

class NewType { 
private: 
    float val; 

public: 
    NewType(float v) { val = v; } 
    // Arithmetic operators 
    friend NewType operator+(const NewType &c1, const NewType &c2); 
    friend NewType operator-(const NewType &c1, const NewType &c2); 
    friend NewType operator*(const NewType &c1, const NewType &c2); 
    friend NewType operator/(const NewType &c1, const NewType &c2); 

    float GetVal() { return val; } 

    float max(const NewType &lhs, const NewType &rhs) { return lhs.val > rhs.val ? lhs.val : rhs.val; } 
    }; 

// Arithmetic Operations 
NewType operator+(const NewType &c1, const NewType &c2) { return NewType(c1.val + c2.val); } 
NewType operator-(const NewType &c1, const NewType &c2) { return NewType(c1.val - c2.val); } 
NewType operator*(const NewType &c1, const NewType &c2) { return NewType(c1.val * c2.val); } 
NewType operator/(const NewType &c1, const NewType &c2) { return NewType(c1.val/c2.val); } 


int main() { 

    NewType a = 10.2; 
    NewType b = 8.4; 
    NewType c = a+b; 

    cout << c.GetVal() << std::endl; 

    NewType d = max(a,b); 
    cout << d.GetVal() << endl; 
    return 0; 
} 
+0

'友人フロートMAX(...' –

+3

あなたはない 'max'があなたのクラスで定義され、STD :: max''呼んでいる。 'のstd :: max'は'演算子< 'デフォルトで使用しています – Cameron

+6

これを使用して終了する時間はたぶん: 'using namespace std;' – drescherjm

答えて

2

maxを非スタティックメンバー関数として実装しました。 aは、実際には非静的メンバ関数としてmaxを宣言しているという事実を除いて、すべてでこの操作のために必要されていないことを

NewType a(0.0f), b(1.0f), c(2.0f); 
NewType d = a.max(b, c); 

のお知らせ:あなたはこのようにそれを呼び出します。 1つの解決策は、非メンバ関数にすることです。

// outside of the class body 
float max(const NewType &lhs, const NewType &rhs) { 
    return lhs.GetVal() > rhs.GetVal() ? lhs.GetVal() : rhs.GetVal(); 
} 

別の(より良い、IMO)ソリューションは、あなたのクラスのoperator<をオーバーロードし、その後、あなたのクラスが自動的にstd::minstd::maxだけでなく、標準ライブラリのアルゴリズムとコンテナのホストで動作しますでしょう。

// member version, inside the class 
bool operator<(const NewType& rhs) const { 
    return val < rhs.val; 
} 

// non-member version, outside the class 
bool operator<(const NewType& lhs, const NewType& rhs) { 
    return lhs.GetVal() < rhs.GetVal(); 
} 

メモ:GetValをconstにしてください。

float GetVal() const { return val; } 
+0

あなたの答えはたくさんありがとうございました。 クラスNewType { プライベート: \t float val; public: \t NewType(float v){val = v; } \t bool演算子<(const NewType&rhs)const {return val smjee

+0

@smjee:' std :: max'は渡されたのと同じ型を返します(これは自然なことです).2つの 'NewType'オブジェクトが渡された場合、' NewType'オブジェクトを返します。 max関数は浮動小数点数を返します。出力 'operator <<'は 'float'に対してオーバーロードされていますが、あなたのタイプではありません。だから、あなたはそのオーバーロードを提供するか、 'std :: max'(a、b).GetVal()を使って' std :: max'の結果から浮動小数点を得ることができます。 –

+0

@smjee:まあ、それを待つ間、別の問題は、あなたが 'operator <'を二度重ねたことです。メンバー関数として1回、非メンバー関数として1回。おそらく私は明確ではなかったが、私はあなたに二つの可能性を示していただけだった。あなたは1つを選ぶ必要があり、両方を使用することはありません。それ以外の場合はあいまいさがあります。 –

関連する問題