2017-04-06 15 views
0

で私はこのようなクラスを書いている:過負荷演算子は= Cで2つの引数++

class Digit 
{ 
    private : 
     int *ref; 
    public : 
     Digit (int a) : ref(&a) {} 
     int get_val() 
     { 
      return (*ref); 
     } 
     Digit operator= (int &a) 
     { 
      if (a < 0 || a > 9) 
       throw "invalid digit assignment."; 
      (*ref) = a; 
      return (*this); 
     } 
    }; 

誰かが数字を定義した場合ので、彼はそれに値を超え9未満0を割り当てることはできません。 問題は、別の=演算子を定義して、ある値にDigitを割り当てることもできるということです。 私はこのような何か試してみました:

int operator= (int &a, Digit &d) 
{ 
    a = d.get_value(); 
    return a; 
} 

をしかし、私はいくつかのエラーを取得:'int operator=(int&, Digit&)' must be a nonstatic member function

は、私はこれをどのように修正することができますか?どのように私は演算子= 2引数でオーバーロードできますか?

+1

なぜ 'ref'は*ポインタ*ですか? – molbdnilo

+4

「代入演算子をどのようにオーバーロードできますか」と考えるのではなく、「暗黙的に 'Digit'を' int'に変換する方法を考えてください。 – molbdnilo

+0

@molbdnilo私は次のように数字を返す[]演算子を持つクラスを書く必要がありました。a [10] = 5; (そして一部のメンバーが5.に変更されました) – iambb5445

答えて

3

あなたは本当にしているオペレータがなければ、あなたのような何かをしたいです必要性はoperator int()である可能性があります。

class Digit { 
    operator int() { return get_val(); } 
}; 

次に、あなたはdclass Digitであると仮定しint a = d;を書くことができます。

+0

これは即時の問題を解決しますが、プログラムが複雑になると直ちに 'int'と' Digit'が渡されて返されるので、キャスト演算子は頭痛の種です。あなたは少なくともそれが起こることを期待しているところで "サイレント"コンバージョンが起こる可能性があります。 – PaulMcKenzie

+2

@PaulMcKenzieこれは、演算子を「明示的」にすることで解決できます。 – NathanOliver

+0

ありがとう!それは私の問題を解決しました。 – iambb5445

0

私が正しく理解すれば、あなたはDigitの値をintとして取得しようとしていると思います。

operator =はに割り当てるためのもので、operator =は使用しません。クラスから値を抽出したいとします。

あなたの方法:

int get_val() 
{ 
    return (*ref); 
} 

はすでにこれを行います。ただし、クラスメンバーの値は変更されないため、

int get_val() const 
{ 
    return (*ref); 
} 

である必要があります。

使い方は次のようになります。

int main() 
{ 
    Digit digit(5); 
    int myInt = digit.get_value(); 
    return 0; 
} 

あなたは暗黙的にintに数字を変換したい場合は、あなただけのショートカットです

operator int() 
{ 
    return get_val(); 
} 

を使用することができます。

#include <iostream> 

void Print(int x) 
{ 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    Digit digit(5); 
    Print(digit.get_value()); 

    return 0; 
} 

が、オペレータに、あなたはint型のような(変換)桁クラスが処理することができるコンパイラに伝える:

#include <iostream> 

void Print(int x) 
{ 
    std::cout << x << std::endl; 
} 

int main() 
{ 
    Digit digit(5); 
    Print(digit); 

    return 0; 
} 
+0

私はヘッダファイルを書いています。誰かがmain関数を書くつもりです。 – iambb5445

関連する問題