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
声明为typeBar*
时,arr
的每个元素都可以是对象,即Bar
,而不是指针。您可以使用:
arr[0] = Bar{};
您不能使用:
arr[0] = new Bar;
问题:
5) 假设我做了Foo*Foo=newfoo();,如果我删除了foo,我想引用仍然存在,除非我在构造函数中处理它们
这没有道理。我想你的意思是“除非我在施工中照顾好他们?”
那就对了。你能解释一下这一行吗?我问这个问题是因为
arr
和bar
都有类型bar*
,因此/butarr[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;