我有两个班级,Foo
和Bar
。它们都包含指向Baz
对象的指针。我希望Foo实例和Baz
实例中的Bar
指针指向同一个Baz
对象。
Baz
对象有一个名为name的成员,带有getter和setter函数。
Foo
对象包含Bar
个对象。
Bar
对象有一个方法来打印Baz
对象的名称。
Baz
对象名称必须在Foo
范围内设置。
这就是我的尝试:
在Foo
的构造函数中,它设置了此bazA
的名称,并将属于bazB
的{{1}}设置为等于bar
属于bazA
。
Foo
当我这样做时:
//Foo.h
class Foo {
public:
explicit Foo();
Baz* bazA;
Bar bar;
}
//Foo.cpp
Foo::Foo()
{
this->bazA->setName("hello");
this->bar.bazB = bazA;
}
//Bar.h
class Bar{
public:
Baz* bazB;
void printName ();
}
//Bar.cpp
void Bar::printName ()
{
std::cout << "name: " << bazB->getName();
//Should print out "name: hello"
}
程序崩溃,因为名称成员尚未在属于//Main.cpp
Foo foo;
foo.bar.printName();
对象的Baz
对象中初始化。
但属于Bar
的{{1}}对象应该是属于Baz
的{{1}}对象,该对象已设置了名称,因此它应该有效。< / p>
为什么我收到此错误?
如何在Bar
和Baz
类之间正确分享Foo
个对象?
答案 0 :(得分:1)
您必须共享对象的代码是正确的:Foo
创建Baz
,然后将其传递给Bar
。问题是您没有正确构建Baz
:
Foo::Foo()
{
this->bazA->setName("hello"); // crash because bazA hasn't had memory allocated
this->bar.bazB = bazA; // setting bazB to invalid memory
}
相反,您应该在Baz
中拥有Foo
的对象,并与Bar
分享:
class Foo {
public:
Foo();
Baz bazA;
Bar bar;
}
Foo::Foo()
{
bazA.setName("hello");
bar.bazB = &bazA;
}
更好的是,Bar
的构造函数应该采用Baz
引用:
class Bar
{
public:
Bar(Baz& b) : bazB(b){}
private:
Baz& bazB;
};
Foo::Foo()
: bazA(), bar(bazA)
{
bazA.setName("hello");
}
我假设Class
和Public
是拼写错误并进行了纠正。