在Rectangle和Square之间有继承问题

时间:2016-02-17 21:27:30

标签: c++

我是第一学期的计算机科学专业学生,在这个问题上遇到了麻烦。

编写一个名为Rectangle的类,其长度和宽度包含双字段,为两个字段设置方法,构造函数接受两个双参数并将它们传递给set方法。它应该包括一个方法,称为矩形区域和周边区域以及矩形的周长。

编写一个名为Square的类,它继承自Rectangle。它应该有一个构造函数,它接受一个double参数并将它传递给两个参数的基类构造函数(构造函数的主体将为空)。 Square还需要覆盖其基类的setLength()和setWidth()函数,这样如果其任一维度设置为新值,则其两个维度都将设置为该新值(以便它保持不变一个正方形)。提示:您可以让被覆盖的版本调用基类中的版本。

我使用Code :: Blocks和C ++作为语言。

Rectangle.hpp

#include <iostream>
using namespace std;
#include <cmath>
#ifndef Rectangle_HPP
#define Rectangle_HPP

class Rectangle
{
 protected:
 double length;
 double width;
 public:

 Rectangle();
 Rectangle(double,double);
 double area();
 double perimeter();
 void setLength(double);
 void setWidth(double);
};

#endif

Rectangle.cpp

#include <iostream>
using namespace std;
#include <cmath>
#include "Rectangle.hpp"

Rectangle::Rectangle(double l, double w)
 {
   length = l;
   width  = w;
 }

double Rectangle::area()
 {
  return (width * length);
 }

double Rectangle::perimeter()
 {
    return (2*(width + length));
 }

void Rectangle::setLength(double l)
{
  length = l;
}

void Rectangle::setWidth(double w)
{
  width = w;
}

Square.hpp

#include <iostream>
using namespace std;
#include <cmath>
#include "Rectangle.hpp"
#ifndef Square_HPP
#define Square_HPP

class Square: public Rectangle
{
  public:

  Square();
  Square(double);
  void setLength(double);
  void setWidth(double);
};
#endif

Square.cpp

#include <iostream>
using namespace std;
#include <cmath>
#include "Rectangle.hpp"
#include "Square.hpp"

Square::Square(double side){}

void Square::setLength(double side)
{
  length = side;
  width = side;
}

void Square::setWidth(double side)
{
  length = side;
  width = side;
}

 int main()
{
    return 1;
}

我已经使用main方法测试了Rectangle.hpp和Rectangle.cpp,它们似乎工作正常,但是我遇到了Square.hpp和Square.cpp的问题。有没有看到我明显遗失的东西。对Rectangle :: Rectangle的未定义引用是Code :: Blocks到目前为止唯一返回给我的错误。它说错误在Square.cpp文件中。我确保所有四个文件都是同一个项目的一部分,所以这不应该是问题。

2 个答案:

答案 0 :(得分:0)

&#34;对Rectangle :: Rectangle的未定义引用是唯一的错误&#34;

你真的应该认真对待链接器告诉你的事情。

在rectangle.h中,您已经定义了一个默认构造函数

Rectangle();

但是你没有实现它!所以链接器抱怨。

写下这样的东西:

Rectangle::Rectangle()
: length( 0 )
, width( 0 )
{}

答案 1 :(得分:0)

不应声明Rectangle :: Rectangle()无参数构造函数(在我对规范的解释中)。

没有参数的Square :: Square()不应该被定义(在我对规范的解释中)。

Square :: Square(double)构造函数不应该调用基类的默认构造函数(您的代码当前所使用的构造函数)。相反,要求要求

Square :: Square(双倍长度):矩形(长度,长度){}

希望有所帮助。