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);
}

Ok。はい、これは大学の宿題です。答えだけを探しているわけではありません。このプログラムでセグメンテーション違反が発生する理由と、それを修正する方法を知りたいです。

エラーが Circle コードにあることはわかっています。ここでは、Circle クラスのコンストラクターで circlePOint へのポインターを渡します。なぜセグフォルトが発生するのかわかりません。誰かが洞察を提供できることを願っています。ありがとう。

コードが汚い場合は申し訳ありません。ここに4つのスペースなどを適切に貼り付けるのに苦労しました。

4

2 に答える 2

0

middlePointCircle2番目のコンストラクターには割り当てられません。メモリを与える前に、それに値を割り当てています。余談ですが、なぜポインタが必要なのかわかりません。

于 2012-06-18T04:25:45.153 に答える
0

クラス内でポイントへのポインターを使用するのはなぜですか? この方法でのみメモリリークが発生し、(独自のコピー操作なしで)中点が異なる円で共有される可能性があるため、問題が発生します。

PS:そして、すべての円に(非定数であっても)PI値を持つ必要はありません-(公正な)cmathからの定数を使用するだけです。

于 2012-07-06T08:44:09.497 に答える