类中的引用对象和其他引用对象

Reference Objects Within Classes, and other reference objects

本文关键字:对象 引用 其他      更新时间:2023-10-16

最近我对一些概念感到困惑,所以我想确保我知道回答这些问题的正确方法,以下是我得到的

class Bar
{
    // stuff here
};
class Foo
{
    private:
        Bar* bar;
        Bar* arr;
    public:
        void setBar(Bar*);
        void setArr(Bar*, int);
        Foo();
};
Foo::Foo()
{
    arr = new Bar[10];
}

void Foo::setBar(Bar* bar)
{
    this->bar = bar;
}
void Foo::setArr(Bar* bar, int element)
{
    // i did not test this to see if it worked so if i have incorrect syntax, im meaning to have an allocated array of Bar pointer objects 
    this->arr[element] = bar;
}

int main()
{
    Foo foo();
    Bar* bar = new Bar();
    foo.setBar(bar);
    Bar* bar2 = new Bar();
    foo.setArr(bar2, 4);
}

1) 如果我在main中执行这个命令"delete bar",它会删除foo类中对bar的引用吗?

2) "delete bar2"也是如此,它删除了对foo类中allcoated数组中bar对象的引用吗?

3) 由于我将Foo声明为Foo-Foo(),而不是Foo*Foo=new Foo(),由于它不是一个分配的对象,我无法删除它(据我所知),所以类中的任何引用都会超出范围吗?

4) 我想我可能弄错了语法,因为我在记事本上这样做了,我怎么能分配一个分配的Bar对象数组,Bar指针数组?所以arr的每个数组元素都是一个Bar*,我可以稍后在解构器中删除它

5) 假设我确实做了Foo*Foo=new Foo();,如果我删除了foo,我想引用会保留下来,除非我在构造函数中处理它们?

我想这就是我剩下的所有问题,我只需要澄清一下,提前谢谢各位!

问题:

1) 如果我在main中执行这个命令"delete bar",它会删除foo类中对bar的引用吗?

是的。危险在于现在foo对象有一个悬空指针。

问题:

2) "delete bar2"也是如此,它删除了对foo类中allcoated数组中bar对象的引用吗?

同样的事情。对危险在于现在foo对象有一个悬空指针。

问题:

3) 一旦我将Foo声明为Foo foo()而不是Foo* foo = new Foo(),由于它不是分配的对象,我就无法删除它(据我所知),那么类中的任何引用都会超出范围吗?

线路

Foo foo();

不创建对象。它声明了一个不带参数的函数foo,并返回一个Foo。请参阅Most Vexing Parse的目的是什么?了解更多详细信息。

要创建对象,请使用:

Foo foo;

Foo foo{};

说到您的问题,当对象超出范围时,通过调用析构函数来释放对象使用的资源。在这种情况下,当程序从main返回时,对象将超出范围。

问题:

4。。。。。。如何分配已分配的Bar对象数组和Bar指针?所以arr的每个数组元素都是一个Bar*,我可以稍后在解构器中删除它

arr被声明为类型Bar*的情况下,arr的每个元素都可以是对象,即Bar,而不是指针。您可以使用:

arr[0] = Bar{};

你不能使用:

arr[0] = new Bar;

问题:

5) 假设我确实做了Foo*Foo=new Foo();,如果我删除了foo,我想引用会保留下来,除非我在构造函数中处理它们?

这没有道理。我想你的意思是说"除非我在建造师里照顾他们?"

这是正确的。