【问题标题】:Comparing data between two objects of a class比较一个类的两个对象之间的数据
【发布时间】:2018-02-15 16:11:30
【问题描述】:

所以,我创建了一个类,然后构造了该类的两个独立实例:

disc discOne; // Construct objects
disc discTwo;

类的声明是通过一个头文件单独完成的:

class disc
{
public:
    disc();
    ~disc();
    void changeRadius(short);
    void throwDisc(short, short);
    void printLocation() const;
    void printInfo() const;
private:
    short radius;
    short xlocation;
    short ylocation;
};

例如,我可以使用 printInfo() 和 changeRadius() 函数,但是如何比较(例如)这两个对象之间的半径?我想做一些比这更复杂的事情,但是如果我了解了基础知识,我想尝试弄清楚。

我遇到的问题是我过去使用过结构,如果是这样的话,我会简单地去:

discOne.radius > discTwo.radius

或类似的东西。但是,类的语法调用了与该类相关的函数。很抱歉漫无边际,但我无法表达清楚 - 这可能是我难以通过自己在互联网上搜索找到任何指导的原因。

【问题讨论】:

    标签: c++


    【解决方案1】:

    三种方式:

    1. 使用getter方法getRadius() const {return radius;} 像往常一样进行比较。

    2. 如果您想直接比较两个对象,请对 operator<operator> 使用重载(但这似乎不是正确的情况。

    3. 声明一个友元函数bool compareRadius(const Disc& discOne, const Disc& discTwo)来执行比较而不直接涉及对象。

    当然最简单的方法是第一种。我只是展示了一些其他选项,您可以考虑解决类似问题。

    编辑:答案 #3 基于 Scott Meyer 的 Effective C++,第 23 项(尽管它指定了非朋友)。

    【讨论】:

      【解决方案2】:

      你可以在你的类中添加一个“getter”(比如short getRadius() const),通过它你可以获得一个值来比较:discOne.getRadius() < discTwo.getRadius()

      或者,您可以将operator< 重载添加到disc 本身,并让它执行半径之间的比较。但是,这仅在半径是圆盘的唯一属性时才有意义(它不是——你也有位置),并且如果比较半径等同于比较圆盘(我不相信这是合乎逻辑的)。

      除此之外,还有各种笨拙的解决方案,比如添加bool radiusIsLesserThatThisOtherDiscsRadius(const disc& otherDisc) const 成员函数。

      但是,类的语法调用与该类相关的函数

      实际上,这不是真的; C++ 没有“结构”,所以struct 也引入了一个类,如果radius 不是私有 数据成员,discOne.radius > discTwo.radius 在这里也可以正常工作。但它是一个私有数据成员是合适的。

      struct disc
      {
      public:
          disc();
          ~disc();
          void changeRadius(short);
          void throwDisc(short, short);
          void printLocation() const;
          void printInfo() const;
      private:
          short radius;
          short xlocation;
          short ylocation;
      };
      
      // ^ Exactly the same thing; your approach still won't work, for the same reason
      

      【讨论】:

      • @ArnavBorborah: OP 错误地认为discOne.radius > discTwo.radius 只是不起作用,因为他现在写的是class 而不是struct,并且点运算符只能调用一个成员function 类(只有当你的所有数据成员都是私有的,这在实践中才是正确的,这可能是在某种课程中被敲定的) - 我正在展示结构/类的区别相关性再低。
      • @ArnavBorborah 没问题!
      • 所以,我的程序目标不一定是只比较两张光盘的半径。它更复杂,我只是不想要求我所做的一切,因为我担心这会破坏我实际学习如何自己解决这些问题的目的。不过非常感谢您的回复。
      【解决方案3】:

      objects 上重载> 运算符的简单解决方案如下所示,以比较类的两个对象的半径。

      discOne > discTwo;
      

      你可以根据你的要求重载>,这里是简单的一个

          bool disc :: operator > (disc my_disc)
          {
                  if(radius > my_disc.radius)
                          return true;
                  else
                          return false;
          }
      

      以上是解决您的问题的解决方案之一。还有其他方法可以按照其他人的建议比较两个对象。使用单独的 member 函数(或 friend 函数)来完成相同的任务。

      【讨论】:

      • 但这忽略了 location 属性。
      • 同意@LightnessRacesinOrbit
      猜你喜欢
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      • 2018-01-26
      • 2014-05-03
      • 1970-01-01
      相关资源
      最近更新 更多