Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 前向声明和析构函数_C++_Oop_Destructor_Forward Declaration - Fatal编程技术网

C++ 前向声明和析构函数

C++ 前向声明和析构函数,c++,oop,destructor,forward-declaration,C++,Oop,Destructor,Forward Declaration,假设它的构造函数是一个简单的类线段,它是从类点出发的两个对象: class Point ; class LineSegment { public: LineSegment(Point* P1, Point* P2); ~LineSegment(); } ; 问题是,在析构函数中,我应该先删除点,还是自动删除?换句话说,在cpp文件中,应写入以下哪项: LineSegment::~LineSegment() 或 首先,请注意 LineSegment::~Li

假设它的构造函数是一个简单的类线段,它是从类点出发的两个对象:

class Point ;

class LineSegment {
    public:

      LineSegment(Point* P1, Point* P2);
      ~LineSegment();
} ;
问题是,在析构函数中,我应该先删除点,还是自动删除?换句话说,在cpp文件中,应写入以下哪项:

LineSegment::~LineSegment()

首先,请注意

LineSegment::~LineSegment(){
     ~P1();
     ~P2();
}
这是无效的。要删除,您需要
删除P1
删除P2

另外,找出谁拥有
P1
P2
。如果它们属于类,请在析构函数中删除它们,但请注意,在对象销毁后,您将无法在外部访问它们

例如:

Point* p1 = new Point;
Point* p2 = new Point;

{
   LineSegment l(p1,p2);
}

delete p1;
delete p2;
如果
删除析构函数中的指针,则将是非法的

无论选择哪个版本,请确保记录您的决定,即明确说明类是否拥有指针的所有权

如果首先使用智能指针,则不会出现此问题,请注意

LineSegment::~LineSegment(){
     ~P1();
     ~P2();
}
这是无效的。要删除,您需要
删除P1
删除P2

另外,找出谁拥有
P1
P2
。如果它们属于类,请在析构函数中删除它们,但请注意,在对象销毁后,您将无法在外部访问它们

例如:

Point* p1 = new Point;
Point* p2 = new Point;

{
   LineSegment l(p1,p2);
}

delete p1;
delete p2;
如果
删除析构函数中的指针,则将是非法的

无论选择哪个版本,请确保记录您的决定,即明确说明类是否拥有指针的所有权


如果要使用智能指针删除它们,则不会出现此问题,必须使用delete运算符,这样:

LineSegment::~LineSegment(){
     delete P1;
     delete P2;
}
这样做将调用P1和P2的析构函数

自动删除点的唯一方法是将它们作为类的成员按值删除:

class LineSegment {
protected:
    Point P1;
    Point P2;
public:
    /* constructors and destructors */
};

这样,删除线段时,P1和P2将自动销毁

要删除它们,必须使用delete运算符,这样:

LineSegment::~LineSegment(){
     delete P1;
     delete P2;
}
这样做将调用P1和P2的析构函数

自动删除点的唯一方法是将它们作为类的成员按值删除:

class LineSegment {
protected:
    Point P1;
    Point P2;
public:
    /* constructors and destructors */
};


这样,删除线段时,P1和P2将自动销毁

谢谢。但是除了我的语法错误之外,我应该先删除这些点,还是在删除线条对象时自动删除它们?@Pouya如果使用
new
malloc
分配它们,它们不会自动删除。但问题是——你会在课堂之外的任何地方删除它们吗?或者该类是否拥有所有权?我想你要么没有读过,要么不明白我的答案。谢谢。但是除了我的语法错误之外,我应该先删除这些点,还是在删除线条对象时自动删除它们?@Pouya如果使用
new
malloc
分配它们,它们不会自动删除。但问题是——你会在课堂之外的任何地方删除它们吗?或者该类是否拥有所有权?我想你要么没有读过,要么不明白我的答案。第一个答案也行。这取决于你想要什么。如果
为其他人所有(例如
std::vector
),您将在稍后遇到“不明白为什么,它必须工作”类型的崩溃。类声明没有将
s显示为类成员,因此…@Damon我们可以假设它们是成员,而他只是将它们排除在外。他还能在析构函数中怎么称呼他们?@LuchianGrigore:声明的要点很好。当然,这并不意味着类实际上拥有指向
点的
对象(因此允许删除它们)。拥有“点”和“线”,一种非常有效的方法(考虑转换它们,而不仅仅是分配)是将点存储在数组或向量中,并从线对象引用它们(不拥有它们)。@Damon我不是说它拥有它们。第一种方法也可以。这取决于你想要什么。如果
为其他人所有(例如
std::vector
),您将在稍后遇到“不明白为什么,它必须工作”类型的崩溃。类声明没有将
s显示为类成员,因此…@Damon我们可以假设它们是成员,而他只是将它们排除在外。他还能在析构函数中怎么称呼他们?@LuchianGrigore:声明的要点很好。当然,这并不意味着类实际上拥有指向
点的
对象(因此允许删除它们)。拥有“点”和“线”,一种非常有效的方法(考虑转换它们,而不仅仅是分配)是将点存储在数组或向量中,并从线对象引用它们(不拥有它们)。@Damon我不是说它拥有它们。@LuchianGrigore是的,但是在这种情况下,当调用析构函数时,这些点不会被删除,当它们上面不再有智能指针时,它们会被删除。这是不好的,因为。。。?如果多条线段具有相同的点,那么这是一件好事,而使用对象(如在代码中)在内存方面是浪费的(您复制的是相同的点)。@LuchianGrigore我不是说这不好,问题似乎是关于在
线段
被销毁时删除点。@LuchianGrigore是的,但在这种情况下,调用析构函数时不会删除点,当它们上没有更多智能指针时,它们会被删除。这是不好的,因为。。。?如果多条线段具有相同的点,那么这是一件好事,而使用对象(如在代码中)在内存方面是浪费的(您复制的是相同的点)。@LuchianGrigore我不是说这是浪费