【问题标题】:operator overloading about Abstract class (cpp)关于抽象类 (cpp) 的运算符重载
【发布时间】:2021-11-13 18:48:55
【问题描述】:

在 student.h 文件中

class Student {
 protected:
  string Name;
  int Stu_num;
 public:
  virtual void print() = 0;
  // constructor...
}

class Grad_Student: public Student {
 private:
  string Lab;
 public:
  void print();
 // constructor...
}

class Undergrad_Student: public Student {
 private:
  string Major;
 public:
  void print();
  // constructor...
}

在 student.cpp 文件中

bool operator == (const Student& x, const Student& y) {
 if (typeid(x) != typeid(y)) return false;
 else // dosomething..
}

我想比较 Student 类的孩子;研究生和本科。 在 main.cpp 中,当我比较两个学生班级时,它不起作用..

Grad_Student grad1 = Grad_Student("Max", 11, "Hubo");
Student *std1 = &grad1;

Grad_Student grad2 = Grad_Student("Max", 11, "Hubo");
Student *std2 = &grad2;

cout << (std1 == std2) << endl; // it always prints 0.
cout << (*std1 == *std2) << endl; 
// I think this line should work, but makes error.
// error: invalid operands to binary expression ('Student' and 'Student')

我应该在学生课上重载 operator== 吗? 给我一个提示...

【问题讨论】:

  • 你得到什么错误?
  • “它不起作用” 请描述您所询问的问题。否则,我们必须猜测什么不起作用。
  • 不应该Undergrad_Student 派生自Student
  • 正如您发布的那样...目前您的覆盖运算符根本不返回任何内容。你可能希望它做一些事情......比如比较学生对象的数量和名称,然后返回 true 表示它们相同或返回 false 表示它们不同。
  • @gun bos:您的代码似乎有多个严重错误,其中任何一个都可以解释问题。请阅读 Wbuck 的response。如果它回答了您的问题,请“投票”并“接受”答案。

标签: c++ class inheritance overloading abstract


【解决方案1】:

所以,重载的相等运算符什么也不做……你需要比较正文中的某些内容并返回 boolean 结果。

另外,您的Undergrad_Student 目前并非源自Student.. 此外,由于您要比较 2 个 Student 对象,您可以让相等运算符重载一个接受 1 个参数的成员函数。

类似这样的:

class Student {
public:
    explicit Student( int id )
        : id_{ id }
    { }

    bool operator==( const Student& other ) const {
        return id_ == other.id_;
    }

    virtual void print() const = 0;
    virtual ~Student( ) = default;

protected:
    int id_;
}; 

class Grad: public Student {
public:
    explicit Grad( int id )
        : Student{ id }
    { }

    void print() const override {}
};

class Undergrad : public Student {
public:
    explicit Undergrad( int id )
        : Student{ id }
    { }

    void print() const override {}
};

int main( ) {
    Grad s1{ 11 };
    Undergrad s2{ 12 };

    // Prints false.
    std::cout << std::boolalpha << ( s2 == s1 ) << '\n';

    Grad s3{ 42 };
    Undergrad s4{ 42 };

    // Prints true.
    std::cout << std::boolalpha << ( s3 == s4 ) << '\n';
}

【讨论】:

  • 谢谢你回答我的问题有一些问题,我修改了我的问题我的问题是'本科生'和'研究生'有不同的成员是实验室和专业,很难比较..
猜你喜欢
  • 2021-11-13
  • 2016-07-15
  • 2012-06-16
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多