顾问,制造对象 我正在做一个C++的小作业,我有一个小问题。尝试运行程序时出现以下错误: Exception thrown at 0x00E0193B in ConsoleApplication6.exe: 0xC0000005: Access violation writing location 0x00000000.

顾问,制造对象 我正在做一个C++的小作业,我有一个小问题。尝试运行程序时出现以下错误: Exception thrown at 0x00E0193B in ConsoleApplication6.exe: 0xC0000005: Access violation writing location 0x00000000.,c++,C++,如果存在此异常的处理程序,则程序可以安全地继续 我试着调试我的程序,我注意到,当我试着创建对象c1时,程序已经用完了。方法v_setR做得很好,但是v_setCenter给出了这个错误。我不知道我做了什么坏事,但我认为这是一个简单的错误。谢谢你的帮助:) 这是主要的cpp: #include "stdafx.h" #include <iostream> #include "Punkt.h" #include "Okrag.h" #include "math.h" /*double

如果存在此异常的处理程序,则程序可以安全地继续

我试着调试我的程序,我注意到,当我试着创建对象c1时,程序已经用完了。方法v_setR做得很好,但是v_setCenter给出了这个错误。我不知道我做了什么坏事,但我认为这是一个简单的错误。谢谢你的帮助:)

这是主要的cpp:

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

出现此错误是因为未分配pd_点。如果您删除指针,这将容易得多。通过删除指针,您可以编写:

Circle::Circle(double dX, double dY, double dR)
    : pd_point(dX, dY),
    d_r(dR)
{
    v_setCenter(dX, dY);
}
您还必须使用
pd\u point
更改功能:

void v_setCenter(double dX, double dY) { pd_point.v_setPoint(dX, dY); }
或者您可以将其保留为指针(例如,如果您的作业需要此指针)。这将要求您在调用
v_setCenter(double,double)
并阅读实现复制构造函数/析构函数/(move)之前为指针分配内存


您没有为pd_点指针分配任何内存。因此,尝试访问pd_点->v_设定点(dX,dY);这是错误的

为了解决此问题,您可以在circle的构造函数中为指针分配内存,如下所示:

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

不过,我必须说,使用初始值设定项列表会让您受益匪浅。有更好的初始化方法

您不需要为
pd\u点
分配任何内存。为什么要用它作为指针?我认为可以将点定义为具有公共坐标值的结构。也不需要指向圆类中的点的指针。
Circle::Circle(double dX, double dY, double dR)
{
    this->pd_point = new Point();
    v_setR(dR);
    v_setCenter(dX, dY);
}