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

时间:2015-11-15 03:29:48

标签: c++ c++11

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

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中执行此命令,"删除栏",是否删除foo类中对bar的引用?

2)同样适用于"删除bar2"它是否删除了foo类中allcoated数组内bar对象的引用?

3)sInce我声明Foo为Foo foo()而不是Foo * foo = new Foo(),因为它不是一个已分配的对象,我不能删除它(据我所知),所以任何引用都可以课堂内有没有超出范围?

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

5)让我说我做了Foo * foo = new Foo();如果我删除foo,我猜测引用仍然存在,除非我在构造函数中处理它们?

我认为这就是我留下的所有问题,我只需要澄清一下,先谢谢家伙和女孩!

1 个答案:

答案 0 :(得分:3)

问题:

  

1)如果我在main中执行此命令,"删除栏",是否删除foo类中对bar的引用?

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

问题:

  

2)同样适用于"删除bar2"它是否删除了foo类中allcoated数组内bar对象的引用?

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

问题:

  

3)sInce我宣称FooFoo foo()而不是Foo* foo = new Foo(),因为它不是一个已分配的对象,我不能删除它(据我所知),所以任何班级中的引用超出了范围?

该行

Foo foo();

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

要创建对象,请使用:

Foo foo;

Foo foo{};

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

问题:

  

4 ......我怎么能分配BarBar指针的分配数组?所以arr的每个数组元素都是Bar*,我可以在以后的解构函数中删除

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

arr[0] = Bar{};

您无法使用:

arr[0] = new Bar;

问题:

  

5)让我说我做了Foo * foo = new Foo();如果我删除foo,我猜测引用仍然存在,除非我在构造函数中处理它们?

这没有意义。我想你应该说"除非我在构造函数中处理它们?"

这是正确的。