【问题标题】:Which operator gets invoked upon object evaluation?在对象评估时调用哪个运算符?
【发布时间】:2015-05-03 06:32:52
【问题描述】:

我想在评估对象时打印我的对象的 id(我的主函数中的第三行“one = two; 应该输出“Object id: 2”)。我知道赋值运算符只被调用对于左值,永远不会调用自身的对话运算符,我不想使用函数调用运算符。

任何想法如何做到这一点,我必须重载哪个运算符?

P.S.:请忽略代码的任何理智,我只关心识别正确的重载运算符。

#include <iostream>    
class Object
{
public:
  Object( int id ) : id_( id )
  {
  }     
  //Assignment operator only invoked for lvalue
  Object& operator= (const Object& other)
  {
    std::cout << "Object id: " << id_ << std::endl;
    return *this;
  }    
  //Conversion operator to itself will never be called
  operator Object() const
  {
    return *(this);
  }    
  //Function call operator - not what I mean
  Object operator()()
  {
    std::cout << "Object id: " << id_ << std::endl;
    return *(this);
  }    
private:
  int id_;
};

int main()
{
  Object one(1);
  Object two(2);
  one = two;
  one = two();
  return 0;
}

【问题讨论】:

  • 如果你想让赋值运算符打印其他人的 id,就这样做。不过,您要达到的目标还不是很清楚。
  • @Mat 我认为问题在于对方的id_ 没有getter,而且它是一个私有成员变量。
  • @PatrickRoberts:这不是问题。
  • @PatrickRoberts:是的,它是同一类。
  • @Christian:您是否正在寻找声明one; 以打印Object id: 1\n

标签: c++


【解决方案1】:

“对象评估”的概念在 C++ 中并不真正存在。当然,表达式可以被求值,并且运算符重载适合这种情况:foo = bar 调用任何与操作数匹配的重载 operator=(特别是在 operator= 的情况下,必须是LHS 类类型的成员)。但要评估的是赋值,而不是foobar(请注意,在运算符重载的上下文中,它们以指针或引用的形式存在,因此任何一个都不会被评估)。

此处的适当解决方案将取决于您要完成的任务。但是,当您的代码提到 bar 时,没有一个函数会自动触发。

【讨论】:

  • 感谢大家的回答。我选择了 Sneftel 的答案,因为它让我意识到不存在“通常在评估时调用的运算符”这样的东西。是的,Bill、Patrick 和其他人,你说得对,在我的示例中,我们可以使用赋值运算符完成打印。但话又说回来,如果对象会在不同的上下文中被评估,那么赋值操作是无关紧要的。
【解决方案2】:
#include <iostream>    
class Object
{
public:
  Object( int id ) : id_( id )
  {
  }     
  //Assignment operator only invoked for lvalue
  Object& operator= (const Object& other)
  {
    std::cout << "Object id: " << other.id_ << std::endl;
    return *this;
  }    
private:
  int id_;
};

int main()
{
  Object one(1);
  Object two(2);
  one = two;
  return 0;
}

我尝试了这个以查看 Mat 是否正确,结果它编译并按预期打印 "Object id: 2"

【讨论】:

    【解决方案3】:

    所以,这一行:

    one = two;
    

    将调用你已经拥有的这个函数:

    Object& operator= (const Object& other)
    {
        std::cout << "Object id: " << id_ << std::endl;
        return *this;
    }
    

    但是,请注意,该函数中有两个 Object 对象可见。

    Object& operator= (const Object& other)
    {
        std::cout << "Object(" << this->id_ << ")";
        std::cout << " = ";
        std::cout << "Object(" << other.id_ << ")";
        std::cout << "\n";
        return *this;
    }
    

    您可以在ideone.com 看到我们运行此代码的完整示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 2018-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多