0

所以我有一个基类(Shape)和三个派生类,Circle、Rectangle 和 Square(Square 是从 Rectangle 派生的)我正在尝试实现 operator<<,它只是调用正确的显示函数来调用它。但是,我认为我的语法不正确。这是一个片段——我哪里出错了?

class Shape
{
     public:
     Shape(double w = 0, double h = 0, double r = 0)
     {
          width = w;
          height = h;
          radius = r;
     }

     virtual double area() = 0;
     virtual void display() = 0;

     protected:
     double width;
     double height;
     double radius;
};

ostream & operator<<(ostream & out, const Shape & s)
{
      s.display(out);
      return out;
}

class Rectangle : public Shape
{
     public:
     Rectangle(double w, double h) : Shape(w, h)
     {
     }

     virtual double area() { return width * height; }
     virtual void display() 
     {
        cout << "Width of rectangle: " << width << endl;
        cout << "Height of rectangle: " << height << endl;
        cout << "Area of rectangle: " << this->area() << endl;
     }
};
4

3 回答 3

0

你这样打电话display

s.display( out );

display定义为:

vritual void display() = 0;

该函数的声明和定义不带参数。它应该将引用std::ostream作为参数:

virtual void display(std::ostream &) = 0;

const当您通过重载传入const对象时,它也应该是一种方法:operator <<

virtual void display(std::ostream &) const = 0;

不要忘记在你的定义中display你应该写给ostream对象,而不是具体的std::cout

这是Ideone上的编译程序。

于 2013-05-11T01:44:36.997 回答
0

您几乎做对了,这是可行的解决方案:

#include <iostream>

using std::cout;
using std::endl;
using std::ostream;

class Shape
{
     public:
     Shape(double w = 0, double h = 0, double r = 0)
     {
          width = w;
          height = h;
          radius = r;
     }

     virtual ~Shape() {} // Recommended!

     virtual double area() const = 0;
     virtual void display(ostream & out) const = 0;

     protected:
     double width;
     double height;
     double radius;
};

ostream & operator<<(ostream & out, const Shape & s)
{
      // Since `s` is `const`, then `display` method should be `const` too.
      s.display(out);
      return out;
}

class Rectangle : public Shape
{
     public:
     Rectangle(double w, double h) : Shape(w, h)
     {
     }

     virtual double area() const { return width * height; }
     virtual void display(ostream & out)  const
     {
        // Since `display` method is `const`, then `area` method should be
        // `const` too.
        out << "Width of rectangle: " << width << endl;
        out << "Height of rectangle: " << height << endl;
        out << "Area of rectangle: " << this->area() << endl;
     }
};


void main() {
    Rectangle r(1, 2);

    cout << r << endl;
}

请注意const强制类方法const正确性的限定符。我添加了一些有用的注释,以便您可以顺利地遵循逻辑。作为一个经验法则,如果方法不修改类成员,那么你应该声明它const

于 2013-05-11T01:46:49.150 回答
0

你在这里有很多问题。首先,让我们处理打印问题:

ostream & operator<<(ostream & out, const Shape & s)

在这里,您正在传递一个const Shape. 这意味着您只能调用传入的const方法s。但是,您没有将基(或派生)类中的任何方法标记为const. 既不area也不display应该改变对象的状态。其次,您尝试调用s.display(out),即传递ostream&to display。您拥有的函数签名没有反映这一点。因此,将所有这些放在一起,我们得到:

 virtual double area() const = 0;
 virtual void display(ostream& out) const = 0;

您还遇到了一些其他问题 - 一个未声明虚拟析构函数的基类。如果你打算多态地使用一个类,它必须有一个虚拟析构函数:

virtual ~Shape() { }

您还需要修改派生类中的方法:

 double area() const { return width * height; }

 void display(ostream& out) const
 {
    out << "Width of rectangle: " << width << endl;
    out << "Height of rectangle: " << height << endl;
    out << "Area of rectangle: " << area() << endl;
 }

请注意,displayinRectangle总是cout预先打印到。

于 2013-05-11T01:47:28.370 回答