gpt4 book ai didi

c++ - 两个不同类之间的构造函数和析构函数

转载 作者:行者123 更新时间:2023-11-30 02:00:38 25 4
gpt4 key购买 nike

所以,我尝试创建两个相互指向的类(有一个指向另一个类的指针作为私有(private)变量),代码如下:

class Fruit
{
public:
Fruit(){
}
private:
Plant *thisPlant;
}

class Plant
{
public:
Plant(){
thisFruit= new Fruit();
}
private:
Fruit *thisFruit;
}

我不确定应该在 Fruit 构造函数中放入什么。我想我不能放 new Plant() 因为它会指向一个新的植物,它也会产生一个错误。我想要这样的东西:Plant 有一个指向 Fruit 的变量。 Fruit 有一个指向 Plant 的变量。因为我会在 Plant 类中使用一些 Fruit 的公共(public)方法,反之亦然。

关于析构函数,我只想澄清一件事。当我销毁 Fruit 变量时,如果我不输入命令“delete thisPlant;”对象 Plant 没有被破坏,对吗?谢谢

最佳答案

如果您将 new Fruit 放入 Plant 构造函数中,并将 new Plant 放入 Fruit 构造函数中,你最终会得到无限递归。创建一个 Plant 将创建一个 Fruit 将创建一个 Plant 将创建一个 Fruit,等等。

Plant ---> Fruit ---> Plant ---> Fruit ---> ...

但这显然不是您想要的关系。一个 Plant 有一个 Fruit,但是那个 Fruit 没有不同的 Plant。它肯定想要一个指向它所属的 Plant 的指针。

Plant <--> Fruit

为此,您的 Fruit 构造函数应该采用类型为 Plant* 的单个参数,以允许 Plant 将指针传递给本身到它拥有的 Fruit

class Plant;

class Fruit
{
public:
Fruit(Plant* parent){
parent = parent;
}
private:
Plant* parent;
};

class Plant
{
public:
Plant(){
fruit= new Fruit(this);
}
private:
Fruit* fruit;
};

请注意,Plant 构造函数将 this 传递给它的 Fruit。现在 PlantFruit 之间存在双向关系。 Plant 知道它的 FruitFruit 知道它的 Plant

现在,请记住每个 new 都必须有一个 delete。这意味着在 Plant 的析构函数中,您应该执行 delete fruit;。当您销毁一个Plant 时,它的析构函数将销毁它的Fruit。您不能然后让Fruit执行delete parent;,因为它的父级已经被销毁了。 植物负责破坏它的果实,而不是相反。

关于c++ - 两个不同类之间的构造函数和析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14943714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com