有形状和圆圈类,以及点类。创建以点类为一个参数的圆时的分段错误

时间:2012-06-18 04:11:49

标签: c++ inheritance constructor segmentation-fault abstract-class

这是我的Shape.h。忽略注释掉的所有代码。这是我认为不正确的版本,但我把它留在那里以防我错了。

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <math.h>
#include "Point.h"


using namespace std;

class Shape {
    public:

        Shape() {}
        virtual ~Shape() {}

        /*
        virtual float calcArea(const Shape& s) const = 0;
        virtual float calcCircum(const Shape& s) const = 0;
        virtual string calcBox(const Shape& s) const = 0;
        virtual void display(const Shape& s) const = 0;
        */

            virtual float calcArea() const = 0;
            virtual float calcCircum() const = 0;
            virtual string calcBox() const = 0;
            virtual void display() const = 0;

};

class Circle : public Shape {
    public:
    int radius;
    int pointX;
    int pointY;
    Point *middlePoint;
    float PI;

    Circle() : Shape() {
        middlePoint = new Point(0,0);
        radius = 0;
    }
    ~Circle() {}

    Circle(int rad, Point& p) : Shape() {
        PI = 3.141592;
        *middlePoint = p;
        pointX = p.getX();
        pointY = p.getY();
        radius = rad;
    }

    // float calcArea(const Circle& s) const {
    float calcArea() const {
        float tempArea;
    //  tempArea = PI * s.radius * s.radius;
    tempArea = PI * radius * radius;
        return tempArea;
        }

    // float calcCircum(const Circle& s) const {
    float calcCircum() const {
    //  int diameter = 2 * s.radius;
    int diameter = 2 * radius;
        float tempCircum;
        tempCircum = PI * diameter;
        return tempCircum;

    }

    // string calcBox(const Circle& s) const {
    string calcBox() const {
//      int x = s.pointX;
//      int y = s.pointY;
//      int r = s.radius;
    int x = pointX;
    int y = pointY;
    int r = radius;
        int tlX = x - r;
        int tlY = y + r;

        int blX = x - r;
        int blY = y - r;

        int trX = x + r;
        int trY = y + r;

        int brX = x + r;
        int brY = y - r;

        Point *topLeft = new Point(tlX,tlY);
        Point *bottomLeft = new Point(blX,blY);
        Point *topRight = new Point(trX,trY);
        Point *bottomRight = new Point(brX,brY);

        stringstream output;
        string tempOut;
        output << *topLeft << *bottomLeft << *topRight << *bottomRight;
        tempOut = output.str();
        return tempOut;

    }

    // void display(const Circle& s) const {
    void display() const {
        cout << "Class Name: Circle" << endl;
//      float tmpArea = calcArea(s);
    float tmpArea = calcArea();
        cout << "Area = " << tmpArea << endl;
//      cout << "Radius = " << s.radius << endl;
    cout << "Radius = " << radius << endl;
//      float tmpCircum = calcCircum(s);
    float tmpCircum = calcCircum();
        cout << "Circumference = " << tmpCircum << endl;
        cout <<"Middle Point = " << middlePoint;
//      string bbox = calcBox(s);
    string bbox = calcBox();
        cout <<"Bounding Box Points = " << bbox;
    }
};

<小时/> 这是我的TMA4Question1.cpp代码。

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <math.h>
#include "Shape.h"

int main() {

    Point *circlePoint = new Point(10,-5);

    Circle *mainCircle = new Circle(23,*circlePoint);
}

确定。是的,这是大学的家庭作业。我不是只想找到答案,我想知道为什么这个程序会给我一个分段错误以及如何纠正它。

我知道错误在Circle代码中,我在Circle类的构造函数中传递指向circlePOint的指针。我不知道它为什么会产生seg故障。我希望有人可以提供一些见解。感谢。

很抱歉,如果代码很乱。很难将它粘贴到这里4个空间和所有这些。

2 个答案:

答案 0 :(得分:0)

middlePoint未在您的第二个Circle构造函数中分配。在给它一些内存之前,你正在给它赋值。顺便说一句,我不明白为什么需要指针。

答案 1 :(得分:0)

为什么要在课程中使用Point指针呢?您只能以这种方式生成内存泄漏,并且(没有您自己的复制操作)会导致问题,因为中点可能会被不同的圈子共享。

PS:并不需要在每个圆圈中都有一个PI值(即使是非常数) - 只需使用(afair)cmath中的常量即可。