【问题标题】:Is it possible to assign object to int?是否可以将对象分配给int?
【发布时间】:2009-07-15 09:48:28
【问题描述】:

我有一个 CCounter 类,它包含受互斥锁保护的整数值。我已经定义了几个运算符,例如 post/pre inc/dec 返回一个整数,所以我可以这样做:

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

但是对于像 i = c 这样的简单分配我该怎么办?我试图定义朋友 operator= 但它给了我

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

错误。请指教。谢谢。

【问题讨论】:

  • 除了其他人写的解决方案之外:您应该将 ++/-- 运算符的返回值设为 CCounter &/CCounter 而不是 int!

标签: c++ operator-overloading


【解决方案1】:

您需要定义一个从 CCounter 转换为 int 的转换运算符。将此成员添加到您的班级:

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

【讨论】:

  • 您好,我这样做了,但我得到了:错误:在初始化 int i = hour; 时无法将“CircularInt”转换为“int”;你有什么想法吗?
  • @Tomer:很遗憾,我无法回答您的问题。 CircularInt 是什么?您的问题与我的回答有何关系?或许您应该提出一个新问题来描述问题的详细信息?
【解决方案2】:

正如您所发现的,赋值运算符必须是类的成员函数。由于整数不是类,因此您不能为它们编写 operator=() 。正如其他人指出的那样,另一种方法是编写一个转换为 int 的函数。我强烈建议您编写一个像 ToInt() 这样的命名函数来执行此操作,而不是使用转换运算符,这可能是不明显错误的来源。

【讨论】:

  • +1 用于解释为什么不能使用 operator= 以及用于显式函数的提示。比代码 sn-p 走得更远......(我已经做到了,真丢脸:))
  • 我建议他将他的 inc/dec 运算符的返回值设为 CCounter &/CCounter 而不是 int!
【解决方案3】:

生日,

如果您只是“获取”计数器的当前值,您不应该定义一个访问器函数吗?

类似:

int GetCounter();

其他任何事情都是在掩饰你想要做的事情的意图。恕我直言,纳奇! (-:

HTH

干杯,

【讨论】:

    【解决方案4】:

    您需要定义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;
    }  
    

    【讨论】:

      【解决方案5】:

      如前所述,使用 int() 运算符。这里有一个代码 sn -p :

      #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;
      }
      

      【讨论】:

        【解决方案6】:

        你说:

        “我已经定义了几个运算符,例如返回整数的 post/pre inc/dec”。

        既然其他答案为您提供了将对象转换为整数的通用方法,我建议您更改这些其他运算符,以便它们按通常预期的方式运行。

        例如,前增量通常返回对对象本身的引用,后增量通常返回原始对象的临时副本(在增量之前)。

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

        【讨论】:

          【解决方案7】:

          虽然您已获得a valid solution,但我也会考虑简单地创建一个返回int 的普通函数,例如int GetValue() const,以提高可读性和易于维护。当然,这是非常主观的。

          【讨论】:

            【解决方案8】:
            #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();
            }
            

            【讨论】:

              猜你喜欢
              • 2021-09-12
              • 2011-03-24
              • 2011-07-19
              • 2013-05-08
              • 2021-11-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多