繁体   English   中英

辅导员,制作对象

[英]Counstructor, making object

我正在使用C ++编写小型作业,但我遇到了小问题。 当我尝试运行程序时,错误如下:

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

如果有用于此异常的处理程序,则可以安全地继续执行该程序。

我尝试调试程序,当我尝试创建对象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");
}

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

您收到此错误,因为尚未分配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)之前分配指针的内存,并在实现复制构造函数/析构函数/(move)之前继续阅读。

这样的事情。

您没有为pd_point指针分配任何内存。 因此尝试访问pd_point-> v_setPoint(dX,dY); 有毛病。

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

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

不过,我确实要说,您将从初始化列表中受益。 有更好的初始化方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM