2015-11-11 3 views
1

Я работаю над небольшой домашней работой на C++, и у меня есть небольшая проблема. Ошибка заключается в следующем, когда я пытаюсь запустить программу:Советник, делающий объект

Exception thrown at 0x00E0193B in ConsoleApplication6.exe: 0xC0000005: Access violation writing location 0x00000000. 

Если есть обработчик для этого исключения, программа может быть безопасно продолжена.

Я попытался отладить свою программу, и я заметил, что эта программа закончилась, когда я попытаюсь создать объект c1. Метод v_setR делает добро, но v_setCenter дает эту ошибку. У меня нет идеи, что я делаю плохо, но я думаю, что это простая ошибка. Спасибо за помощь :)

Это главный каст:

#include "stdafx.h" 
#include <iostream> 
#include "Punkt.h" 
#include "Okrag.h" 
#include "math.h" 

/*double Circle::d_distance(Point pcOther) 
{ 
    double d_result = sqrt(
     (pd_point.d_getX - pcOther.d_getX)*(pd_point.d_getX - pcOther.d_getX) 
     + (pd_point.d_getY - pcOther.d_getY)*(pd_point.d_getY - pcOther.d_getY) 
     ); 
    return d_result - d_r; 
}*/ 

Circle::Circle(double dX, double dY, double dR) 
{ 
    v_setR(dR); 
    v_setCenter(dX, dY); 
} 

void main() 
{ 
    Point p1(1, 2); 

    Circle c1(5,4,4); 

    //std::cout << c1.d_distance(p1); 

    system("pause"); 
} 

Это point.h и circle.h

class Point 
{ 
    friend class Circle; 
    //friend double d_distance(Point &pcOther); 

public: 
    Point() { }; 
    Point(double dX, double dY) : d_x(dX), d_y(dY) { }; 

    // Setters 
    void v_setX(double dX) { this->d_x = dX; } 
    void v_setY(double dY) { this->d_y = dY; } 
    void v_setPoint(double dX, double dY) { this->d_x = dX; this->d_y = dY; } 

    // Getters 
    double d_getX() { return d_x; } 
    double d_getY() { return d_y; } 

private: 
    double d_x, d_y; 
}; 

class Circle 
{ 
    friend class Point; 

public: 
    Circle(); 
    Circle(double dX, double dY, double dR); 

    // Setters 
    void v_setR(double dR) { d_r = dR; } 
    void v_setCenter(double dX, double dY) { pd_point->v_setPoint(dX, dY); } 
    // Getters 
    double d_getR() { return d_r; } 
    Point *d_getCenter() { return pd_point; } 
    //double d_distance(Point &pcOther); 

private: 
    Point *pd_point; 
    double d_r; 
}; 
+2

Вы не выделяете какую-либо память для 'pd_point'. Почему у вас есть это как указатель? – TartanLlama

+0

Я думаю, что вы можете определить точку как структуру с общедоступными значениями для координат. Не нужно указывать указатель на класс круга. –

ответ

1

Вы получаете эту ошибку, потому что pd_point не была выделена. Это было бы намного проще, если бы вы удалили указатель. При удалении указателя вы могли бы написать:

Circle::Circle(double dX, double dY, double dR) 
    : pd_point(dX, dY), 
    d_r(dR) 
{ 
    v_setCenter(dX, dY); 
} 

Вы также должны изменить функцию с помощью pd_point:

void v_setCenter(double dX, double dY) { pd_point.v_setPoint(dX, dY); } 

Или вы могли бы сохранить этот указатель (если назначение этого требует, например). Это потребует от вас выделить память для указателя, прежде чем вы вызовете v_setCenter(double, double) и прочитайте о реализации конструктора/деструктора копирования/(перемещения).

Something like this.

1

вы не выделять какой-либо памяти для указателя pd_point. поэтому пытается получить доступ к pd_point-> v_setPoint (dX, dY); неисправен.

для того, чтобы исправить эту проблему вы можете выделить память для указателя в конструкторе окружности следующим образом:

Circle::Circle(double dX, double dY, double dR) 
{ 
    this->pd_point = new Point(); 
    v_setR(dR); 
    v_setCenter(dX, dY); 
} 

Я должен сказать, однако, что вы выиграли бы от использования списка инициализации. есть лучшие способы инициализации