我有一个CCounter类,其中包含由互斥锁保护的整数值。我已经定义了几个运算符,比如post / pre inc / dec返回一个整数,所以我可以这样做:
CCounter c(10);
int i = c++;
但是如何使用i = c
这样的简单作业呢?我试图定义friend operator =但它给了我
operator=(int&, const CCounter&)’ must be a nonstatic member function
错误。请指教。感谢。
答案 0 :(得分:16)
您需要定义一个从CCounter强制转换为int的转换运算符。将此成员添加到您的班级:
operator int() const {
return ...;
}
答案 1 :(得分:8)
如您所知,赋值运算符必须是类的成员函数。由于int不是类,因此不能为它们编写operator =()。正如其他人指出的那样,替代方法是编写一个转换为int的函数。我强烈建议你写一个像ToInt()这样的命名函数,而不是使用转换运算符,这可能是非明显错误的来源。
答案 2 :(得分: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;
}
答案 3 :(得分:1)
天儿真好,
如果您只是“获取”计数器的当前值,那么您是否应该定义一个访问者函数?
类似的东西:
int GetCounter();
其他任何东西都掩盖了你想要做的事情的意图。恕我直言Natch! ( - :
HTH
欢呼声,
答案 4 :(得分: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;
}
答案 5 :(得分:1)
你说:
“我已经定义了几个运算符,例如post / pre inc / dec返回一个整数”。
既然其他答案为您提供了将对象转换为整数的通用方法,我建议您更改这些其他运算符,使其行为与通常预期的一样。
例如,pre增量通常返回对象本身的引用,post增量通常返回原始对象的临时副本(在增量之前)。
CCounter& operator++() {
++m_val;
return *this;
}
CCounter operator++(int) {
CCounter tmp(*this);
++m_val;
return tmp;
}
答案 6 :(得分:0)
虽然您已获得a valid solution,但我还是会考虑创建返回int 的普通函数,例如int GetValue() const
,以提高可读性和易维护性。当然这是非常主观的。
答案 7 :(得分: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();
}