派生类错误

时间:2013-11-26 21:20:00

标签: c++ class derived-class

我使用派生类完成了一个小程序并且编译正确,但输出错误。

程序使用有序对(x,y)作为圆的中心。然后使用给定的中心和半径来确定圆的面积和周长。

使用pointType类输出有序对可以正常工作,但是当我测试circleType类时,我希望得到(0,0)作为默认值。相反,我得到了(2293512,2293700)

任何帮助都将不胜感激!

这是点类代码:

#ifndef POINTTYPE_H_INCLUDED
#define POINTTYPE_H_INCLUDED
#include <iostream>

class pointType{
 public:
  pointType (int=0, int=0);
  int getX() const;
  int getY() const;
  void setX(int);
  void setY(int);
  void setValues(int, int);
  friend pointType operator + (pointType, pointType);
  friend pointType operator - (pointType, pointType);
  friend std::ostream& operator << (std::ostream&, pointType);
 private:
  int x;
  int y;
};

#endif // POINTTYPE_H_INCLUDED

这是点类实现:

#include "pointType.h"

pointType::pointType (int X, int Y) : x(X), y(Y) {}

int pointType::getX () const {
 return x;
}

int pointType::getY () const {
 return y;
}

void pointType::setX (int new_x) {
 x = new_x;
}

void pointType::setY (int new_y) {
 y = new_y;
}

void pointType::setValues (int new_x, int new_y) {
 x = new_x;
 y = new_y;
}

pointType operator + (pointType lh, pointType rh){
 pointType answer;

 answer.x = lh.x + rh.x;
 answer.y = lh.y + rh.y;

 return answer;
}

pointType operator - (pointType lh, pointType rh){
 pointType answer;

 answer.x = lh.x - rh.x;
 answer.y = lh.y - rh.y;

 return answer;
}

std::ostream& operator << (std::ostream& out, pointType c){
 out << "(" << c.x << ", " << c.y << ")";
 return out;
}

这是圆圈类:

#ifndef CIRCLETYPE_H_INCLUDED
#define CIRCLETYPE_H_INCLUDED
#include "pointType.h"
#include <iostream>

class circleType: protected pointType {
 public:
  circleType (float=0);
  circleType (int=0, int=0);
  void setRadius (float);
  float calculateArea (float);
  float calculateCircumference (float);
  friend std::ostream& operator << (std::ostream&, circleType);
 private:
  float radius;
  int center_x;
  int center_y;
};

#endif // CIRCLETYPE_H_INCLUDED

这是圈子类实现:

#include "pointType.h"
#include "circleType.h"
#include <math.h>

const float PI = 3.14;

circleType::circleType(float R): radius(R) {}

circleType::circleType(int center_X, int center_Y):
 pointType(center_x, center_y) {}

void circleType::setRadius(float new_radius) {
 radius = new_radius;
}

float circleType::calculateArea(float radius) {
 float area;
 area = PI * pow(radius, 2);
 return area;
}

float circleType::calculateCircumference(float radius) {
 float circumference;
 circumference = PI * (radius * 2);
 return circumference;
}

std::ostream& operator << (std::ostream& odata, circleType f) {
 odata << "(" << f.center_x << ", " << f.center_y << ")";
 return odata;
}

这是测试代码:

#include "pointType.h"
#include "circleType.h"
#include <iostream>
#include <math.h>

using namespace std;

int main() {
  pointType c, d(8, 9);
  circleType f(4, 5);
  cout << c << endl;
  cout << d << endl;
  c.setValues(12, 3);
  cout << c << endl;

  cout << c + d << endl;
  cout << c - d << endl;

  cout << f << endl;

  return 0;
}

3 个答案:

答案 0 :(得分:0)

这是一个错字。

circleType::circleType(int center_X, int center_Y):
pointType(center_x, center_y) {}

注意center_ X (大写)和center_ x (小写)之间的区别。 您将未初始化的成员传递给父构造函数,该构造函数可以在堆栈中保留任何值。

因此,m_例如:m_centerX始终优先于您的成员。 (在这种特殊情况下,甚至不需要在子类中再次使用它们,冗余很糟糕!)

编辑:

很抱歉这个混乱,但下次请更加精确,可以为我们节省很多时间。我认为在添加带圆圈的点时会出现问题,在我自己运行代码之后我注意到它在输出f时发生。原因与上面解释的相同:你没有初始化你的成员!它们只保存当前在对象构造的内存位置的任何值。

答案 1 :(得分:0)

据我所知,circleType int members center_x和center_y永远不会被设置。构造函数CircleType :: CircleType(int = 0,int = 0)调用基本构造函数,而构造函数又将pointType.x和pointType.y设置为基类的私有成员(因此不能用于circleType)。

我的建议(或我认为你的意图\预期):使int x和int y受保护,而不是私有,并删除center_x和center_y,然后打印odata&lt;&lt; “(”&lt;&lt;&lt;&lt; f.x&lt;&lt;“,”&lt;&lt; f.y&lt;&lt;“)”;

答案 2 :(得分:0)

在circleType类中,未初始化center_x和center_y。参数将直接传递给pointType构造函数并设置私有成员。您可以通过更改运算符&lt;&lt;来证明这一点。采用circleType参数的函数:

std::ostream& operator << (std::ostream& odata, circleType f) {
    odata << "(" << f.center_x << ", " << f.center_y << ")" << std::endl;
    odata << "(" << f.getX() << ", " << f.getY() << ")"; //access superclass
    return odata;
}

使用受保护的继承,您也不能使用为基类定义的+和 - 重载,它将无法编译。