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

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,我想除非我在构造函数中照顾了引用,否则引用仍然存在吗?

我想这就是我剩下的所有问题了,我只需要澄清一下,在此先感谢大家!

最佳答案

题:



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

题:



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

题:



线

Foo foo();

不创建对象。它声明一个不带参数的foo函数,并返回一个Foo。有关更多详细信息,请参见What is the purpose of the Most Vexing Parse?

要创建对象,请使用:
Foo foo;

要么
Foo foo{};

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

题:



arr声明为Bar*类型后,arr的每个元素都可以是一个对象,即Bar而不是指针。您可以使用:
arr[0] = Bar{};

您不能使用:
arr[0] = new Bar;

题:



那没有意义。我认为您的意思是说“除非我在构造函数中照顾它们?”

那是正确的。

关于c++ - 类内的引用对象以及其他引用对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33716098/

10-16 05:59
查看更多