【问题标题】:C++ Operator Overload - call function to get value inside overloadC++ 运算符重载 - 调用函数以在重载中获取值
【发布时间】:2011-11-09 11:22:37
【问题描述】:

有没有一种方法可以在 C++ 中调用运算符重载并在比较期间调用参数的函数?

例如:

class MyClass{
  private:
    int x;
    int y;
  public:
    MyClass(int x, int y);
    int getX();
    int getY();
    bool operator < (const MyClass &other) const {
        return (x < other.getX()); //this does not work!
        // this would work, though, if x was public:
        // return x < other.x;
    }
};

基本上,在我调用 other.getX() 的地方,我怎样才能让它通过一个函数返回自己的 x 值来与本地的比较,而不是让 x 公开?有没有办法做到这一点?

感谢您的帮助!

【问题讨论】:

  • 很难触及您问题的核心。您发布的代码没有任何问题,other.getX()other.x 都有效(但getX() 需要标记为const)。
  • @Martin:不,它不起作用。查看答案。
  • @RTT:是的,我在先评论后注意到了 const 问题。但是,两个调用都可以,只是不是 const 正确的。有趣的是,有些帖子在一个人能够写几行 cmets 之前得到 4 个答案 :)
  • @RTT:您真的不应该将我的答案标记为已接受...
  • 你可以这样做x &lt; other.x一个类自动成为它自己的朋友。因此,您可以完全访问同一类的其他实例的成员。

标签: c++ function overloading operator-keyword


【解决方案1】:

您需要将函数设为 const,因为您使用的是对 const MyClass 的引用:

int getX() const;

您可以在以下位置阅读有关 const(const 正确性)的良好使用:

另外,我建议您将 operator

【讨论】:

    【解决方案2】:

    它不起作用,因为getX() 不是const 函数。将其更改为:

    int getX() const;
    

    它会起作用的。您也可以删除 operator 参数中的 const,但这通常不会被认为是好的。

    【讨论】:

      【解决方案3】:

      访问是针对每个类的,而不是针对每个实例的。您可以毫无问题地访问other.x

      除此之外,您可以返回一个 const 引用,但它实际上不会对性能产生任何影响,而且看起来很奇怪。

      bool operator < (const MyClass &other) const
      {
          return x < other.x;
      }
      

      【讨论】:

      • +1 这是首选方法。我认为假设您知道自己的类如何工作是安全的,因此访问其他实例的成员是安全的,因此使用无用的 getter 方法是没有意义的。
      【解决方案4】:

      您可以将运算符声明为类的朋友。

      编辑:我的眼睛上似乎有西红柿,您的接线员是班级成员并且已经拥有私人访问权限。你可以把它加为好友,但它是在类范围之外定义的。

      【讨论】:

      • 运算符是该类的成员,因此已经拥有friend 将授予非成员函数的所有访问权限。
      • 是的,我在发布后也意识到了这一点,因此我之前的编辑。
      • 一个类已经是它自己的朋友了。所以它可以访问其他实例的成员。
      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2017-11-02
      相关资源
      最近更新 更多