2009-07-15 12 views
4

私は、保持するCCounterクラスと、mutexで保護された整数値を持っています。私が行うことができますので、私は整数を返すポスト/前INC]/[DECのようないくつかの演算子を定義しました:オブジェクトをintに割り当てることはできますか?

CCounter c(10); 
int i = c++; 

が、私はi = cのような単純な割り当てはどうしたらよいでしょうか私は友人のオペレータを定義しようとしました=が、それは私に

operator=(int&, const CCounter&)’ must be a nonstatic member function

エラーが発生します。お知らせ下さい。ありがとう。

+1

! – mmmmmmmm

答えて

16

CCounterからintにキャストするキャスト演算子を定義する必要があります。あなたのクラスにこのメンバーを追加します。

operator int() const { 
    return ...; 
} 
1

あなたはint型へのクラスの変換を可能にしoperator int()を定義する必要があります。たとえば:あなただけのカウンタの現在の値を「取得」している場合

class CCounter 
{ 
    public: 
    CCounter(int val) : m_val(val) 
    { 
    } 

    operator int() const 
    { 
     return m_val; 
    } 

    private: 
    int m_val; 
}; 





int main(int argc,char *argv[]) 
{ 
    CCounter c(10); 
    int n = c; 

    std::cout<<n<<"\n"; 

    return 0; 
} 
1

やあ、

は、あなたの代わりにアクセサ関数を定義することではないでしょうか?以下のような

何か:

int GetCounter(); 

それ以外はあなたが何をしようとしての意図を隠すの一種です。 IMHO Natch! ( - :

HTH

歓声、

7

あなたが判明したように、代入演算子は、クラスのメンバ関数である必要がありますint型はクラスではないので、あなたは演算子を書き込むことはできません=(。 )他の人が指摘しているように、intに変換する関数を書くことです。これを行うにはToInt()のような名前付き関数を書くことを強くお勧めします。明白ではないバグのソース

+0

+1なぜ演算子=を使用できないのか、そして明示的な機能のヒントのために+1。コードスニペットよりも進んでください...(私はそれをしました、私には恥じました:)) – neuro

+0

そして私は彼のinc/decオペレータCCUNT&/ CCounterの戻り値をintにするのはお勧めしません! – mmmmmmmm

1

このように、int()演算子を使用します。ここではコードスニペットを示します。

#include <iostream> 

class CCounter 
{ 
    public: 
    CCounter(int i = 0) : _count(i) {} 
    operator int() { return _count; } 

    private: 
    int _count; 

}; 

int main() 
{ 
    CCounter counter(4); 
    int c = counter; 
    std::cout << "Counter = " << c << std::endl; 

    return 0; 
} 
0

あなたはa valid solutionを与えてきたが、私はまた、単に読みやすさとメンテナンスのしやすさを向上させるために、このようint GetValue() constとして、int型を返す正常な機能を作成することを検討します。もちろんこれは非常に主観的です。

1

あなたは言った:

は "私は整数を返すポスト/前INC]/[DECのようないくつかの演算子を定義しました"。

他の回答が整数にオブジェクトを変換する一般的な方法をご提供することを今、私は彼らが一般的に期待される振る舞いをするようにあなたがこれらの他の演算子を変更することをお勧めします。

たとえば、プリインクリメントは通常、オブジェクト自体への参照を返します。ポストインクリメントは通常、(インクリメントの前に)元のオブジェクトの一時コピーを返します。 - 演算子CCounter&/ CCounterはなくint型あなたの++ /の戻り値を作成する必要があります。他の人が書いたソリューションの横に

CCounter& operator++() { 
    ++m_val; 
    return *this; 
} 

CCounter operator++(int) { 
    CCounter tmp(*this); 
    ++m_val; 
    return tmp; 
} 
0
#include<iostream> 
using namespace std; 

class CA { 
public: 
    int a; 
    CA(int x):a(x) 
    { 

    } 
    operator int() const { 
     return a; 
    } 

    void operator()() { 

    } 
}; 

void main(){ 

    CA obj = 100; 
    int k = obj; 
    obj(); 
} 
関連する問題