2009-07-15 77 views
4

我有一個CCounter類,它保存着由互斥鎖保護的整數值。我定義了幾家運營商的桿狀/預增/減返回一個整數,所以我可以做:是否可以將對象分配給int?

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

,但我該怎麼做一個簡單的任務像i = c?我試圖界定朋友運算符=,但它給了我

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

錯誤。請指教。謝謝。

+1

旁邊的解決方案,別人說:你應該讓你++ /的返回值 - 運營商CCounter及/ CCounter而不是int! – mmmmmmmm 2009-07-15 11:07:42

回答

16

您需要定義一個從CCounter轉換爲int的轉換運算符。這個成員添加到您的類:

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

您需要定義operator int(),讓你的類爲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(); 

還有什麼是那種掩飾的你正在試圖做的意圖。恕我直言Natch! ( - :

HTH

歡呼聲,

7

正如你已經發現了,賦值運算符必須是類的成員函數爲int不是類,你可以不寫運算符=( )替代方法,正如其他人指出的那樣,編寫一個函數轉換爲int,我強烈建議您編寫一個像ToInt()這樣的命名函數來執行此操作,而不是使用轉換運算符,它可以是非顯而易見的bug的來源

+0

+1用於解釋操作符=爲什麼不能使用的解釋以及顯式函數的提示。比代碼片段更進一步......(我已經這麼做了,對我感到羞恥:)) – neuro 2009-07-15 10:01:55

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,如int GetValue() const,提高維護的可讀性和易用性。當然這是非常主觀的。

1

你說:

「我已經定義了多個運營商如柱/預增/減返回一個整數」。

現在,其他答案爲您提供了一種將對象轉換爲整數的通用方法,我建議您更改這些其他操作符,以使它們的行爲與通常的預期相同。例如,預增量通常返回對對象本身的引用,並且後增量通常返回原始對象的臨時副本(在增量之前)。

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(); 
} 
相關問題