在另一个类C ++中创建一个对象

时间:2016-02-01 18:48:30

标签: c++

我得到一个奇怪的运行时错误,我根本无法理解。 我正在创建我的类Circle的对象,它具有以下默认构造函数:

    Circle::Circle()
{
    this->radius = 0;
    this->center->setX(0);
    this->center->setY(0);
}

正在初始化的变量是:

private:
    double radius;
    Point *center;
};

当我尝试创建类圈的对象时,我收到运行时错误。现在我只在动态声明Point对象时才会出现此错误。 我的语法有什么问题吗? 当我在我的Circle类中声明Point时,改为:

Point center;

并将其初始化为:

Circle::Circle()
{
    this->radius = 0;
    this->center.setX(0);
    this->center.setY(0);
}

有效。 为什么在动态创建对象时会出现这些错误?我可以不使用两个" - >"就像在第一个例子中一样?

这是我的第一篇文章,我希望这不是一个太愚蠢的问题。 提前谢谢。

3 个答案:

答案 0 :(得分:1)

你最好使用

<Target Name="BeforeBuild" Condition="Exists('$(ProjectDir)\obj\Debug\Package\PackageTmp\web.config')">
  <Delete Files="$(ProjectDir)\obj\Debug\Package\PackageTmp\web.config" />
</Target>

你不需要指针。

当前代码的问题在于没有为指针变量分配内存。我也不建议这样做(例如Circle { private: double radius; Point center; // <<<<<<< No pointer here }; )。如上所述,没有必要。

此外,您不需要center = new Point()来访问班级成员。只需在构造函数中使用成员初始值设定项列表:

this->

答案 1 :(得分:0)

center是一个指针。如果您没有为它分配任何内存,则无法访问它,因为它没有指向有效对象。要获得有效的对象,我们将使用

Circle::Circle() : radius(0), center(new Point)
{
    center->setX(0);
    center->setY(0);
}

如果Point的构造函数需要xy,那么您甚至可以使用

Circle::Circle() : radius(0), center(new Point(0, 0)) {}

但我不得不问你是否需要一个指针。如果没有,那么你可以

Circle::Circle() : radius(0),
{
    center.setX(0);
    center.setY(0);
}
// or
Circle::Circle() : radius(0), center(0, 0) {}

答案 2 :(得分:0)

出现此问题是因为center是一个没有分配内存的指针。由于不存在这样的对象,

Circle::Circle()
{
    this->radius = 0;
    this->center = new Point; //call the appropriate Point constructor
    this->center->setX(0); //now these are valid
    this->center->setY(0);
}

另请注意,由于center实际上是您的实施中的指针,center.setX(0)无效,您应该center->setX(0)而不是