是否可以将对象分配给int?

时间:2009-07-15 09:48:29

标签: c++ operator-overloading

我有一个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

错误。请指教。感谢。

8 个答案:

答案 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();
}