0

这是我的 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 的指针。我不知道为什么它会产生段错误。我希望有人可以提供一些见解。谢谢。

对不起,如果代码是混乱的。很难用 4 个空格和所有这些将它正确粘贴到这里。

4

2 回答 2

0

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

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

于 2012-07-06T08:44:09.497 回答
0

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

于 2012-06-18T04:25:45.153 回答