我有一個CCounter類,它保存着由互斥鎖保護的整數值。我定義了幾家運營商的桿狀/預增/減返回一個整數,所以我可以做:是否可以將對象分配給int?
CCounter c(10);
int i = c++;
,但我該怎麼做一個簡單的任務像i = c
?我試圖界定朋友運算符=,但它給了我
operator=(int&, const CCounter&)’ must be a nonstatic member function
錯誤。請指教。謝謝。
我有一個CCounter類,它保存着由互斥鎖保護的整數值。我定義了幾家運營商的桿狀/預增/減返回一個整數,所以我可以做:是否可以將對象分配給int?
CCounter c(10);
int i = c++;
,但我該怎麼做一個簡單的任務像i = c
?我試圖界定朋友運算符=,但它給了我
operator=(int&, const CCounter&)’ must be a nonstatic member function
錯誤。請指教。謝謝。
您需要定義一個從CCounter轉換爲int的轉換運算符。這個成員添加到您的類:
operator int() const {
return ...;
}
您需要定義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;
}
天兒真好,
你不是應該定義一個訪問函數,而不是如果你只是「讓」計數器的當前值?
喜歡的東西:
int GetCounter();
還有什麼是那種掩飾的你正在試圖做的意圖。恕我直言Natch! ( - :
HTH
歡呼聲,
正如你已經發現了,賦值運算符必須是類的成員函數爲int不是類,你可以不寫運算符=( )替代方法,正如其他人指出的那樣,編寫一個函數轉換爲int,我強烈建議您編寫一個像ToInt()這樣的命名函數來執行此操作,而不是使用轉換運算符,它可以是非顯而易見的bug的來源
+1用於解釋操作符=爲什麼不能使用的解釋以及顯式函數的提示。比代碼片段更進一步......(我已經這麼做了,對我感到羞恥:)) – neuro 2009-07-15 10:01:55
正如所說的使用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;
}
雖然您已獲得a valid solution,我也會考慮簡單地創建一個正常功能返回INT,如int GetValue() const
,提高維護的可讀性和易用性。當然這是非常主觀的。
你說:
「我已經定義了多個運營商如柱/預增/減返回一個整數」。
現在,其他答案爲您提供了一種將對象轉換爲整數的通用方法,我建議您更改這些其他操作符,以使它們的行爲與通常的預期相同。例如,預增量通常返回對對象本身的引用,並且後增量通常返回原始對象的臨時副本(在增量之前)。
CCounter& operator++() {
++m_val;
return *this;
}
CCounter operator++(int) {
CCounter tmp(*this);
++m_val;
return tmp;
}
#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();
}
旁邊的解決方案,別人說:你應該讓你++ /的返回值 - 運營商CCounter及/ CCounter而不是int! – mmmmmmmm 2009-07-15 11:07:42