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

C++ 类中的引用对象和其他引用对象,c++,c++11,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 =

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

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中执行这个命令“deletebar”,它会删除foo类中对bar的引用吗

2) “deletebar2”也是如此。它是否删除了foo类中allcoating数组中对bar对象的引用

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

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

5) 假设我做了Foo*Foo=newfoo();,如果我删除了foo,我想引用仍然存在,除非我在构造函数中处理它们

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

问题:

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

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

问题:

2) “deletebar2”也是如此。它是否删除了foo类中allcoating数组中对bar对象的引用

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

问题:

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

线路

Foo foo();
不创建对象。它声明了一个函数
foo
,该函数不带任何参数,并返回一个
foo
。有关更多详细信息,请参阅

要创建对象,请使用:

Foo foo;

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

问题:

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

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

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

arr[0] = new Bar;
问题:

5) 假设我做了Foo*Foo=newfoo();,如果我删除了foo,我想引用仍然存在,除非我在构造函数中处理它们

这没有道理。我想你的意思是“除非我在施工中照顾好他们?”


那就对了。

你能解释一下这一行吗?我问这个问题是因为
arr
bar
都有类型
bar*
,因此/but
arr[element]
有类型
bar
,而不是
bar*
。你收到错误了吗?@Dmaster我没有在IDE中输入它,所以我现在无法测试它,这也是我想在我做错的事情上作为kit的原因之一lol,我试图展示当你有一个动态分配的Bar*对象数组时会发生什么,但我认为我犯了错误,动态分配了一个Bar对象数组,而不是Bar*,因此,我想知道如何真正做到这一点:)谢谢你的回复。我想你应该更正这一行,我用我的编译器编译了你的代码,它告诉了我错误
this->arr[element]=bar
而不是
this->arr[element]=bar
是正确的。另外,我将告诉您关键字
this
的替代方法,当您需要获取成员时,您可以只编写
membername
,而不是
this->membername
,哦,我看到了namesake,您可以使用
classname::membername
(即
Foo::bar=bar
arr[element]=*bar
而不是
这个->bar=bar
这个->arr[element]=*bar]
),无论如何,这是你的选择。谢谢你的建议和帮助:)@R Sahu谢谢你的回复,让我补充一下。对于问题1和2,谢谢,对于问题3,我的意思是声明一个对象,然后调用构造函数so Foo Foo;是我想要的,我不知道为什么我认为我也可以通过执行Foo Foo();,来调用构造函数;。话虽如此,富富之间的区别是什么;和Foo Foo{};?另外,对于问题4,我如何使其成为arr[0]=new Bar();?对于问题5,是的,我的意思是,如果一个对象有引用,并且我确实删除了该对象,但没有删除该类中的引用对象,那么它们会保留在类中吗memory@TannerSummers,
Foo-Foo被称为默认初始化,而
Foo-Foo{}称为值初始化。前往了解各种初始化方法。@TannerSummers,使用
arr[0]=newbar()
arr
必须是指针数组。您需要将其声明为
Bar**arr并将其定义为
arr=新条*[10]@TannerSummers,不客气。我很高兴我能提供帮助。@R Sahu,我刚刚想到了一个问题,如果一个类分配了一个数组并将其返回到main,如果该类被删除,是否允许使用相同的概念,我已经设置好调用解构器并删除该类中数组的分配内存,我猜既然该数组被返回到main,它将不再是主要的访问?
arr[0] = new Bar;