如何在两个 类 之间共享一个对象
How to share an object between two classes
我有两个 类、Foo
和 Bar
。它们都包含指向 Baz
对象的指针。我希望 Foo 实例和 Bar
实例中的 Baz
指针指向同一个 Baz
对象。
一个 Baz
对象有一个名为 name 的成员,具有 getter 和 setter 函数。
一个 Foo
对象包含一个 Bar
对象。
一个 Bar
对象有一个方法来打印 Baz
对象的名称。
Baz
对象名称必须设置在 Foo
的范围内。
这是我试过的:
在Foo
的构造函数中,设置了这个bazA
的名字,并且设置属于bar
的bazB
等于[=27] =]属于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();
程序崩溃,因为name成员在属于Bar
对象的Baz
对象中还没有被初始化。
但是属于 Bar
的 Baz
对象应该是属于 Foo
的同一个 Baz
对象,它已经设置了名称,所以它应该可以工作.
为什么会出现此错误?
如何在 Foo
和 Bar
类 之间正确共享 Baz
对象?
您必须共享对象的代码是正确的: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
}
相反,您应该在 Foo
中有一个 Baz
的对象,并与 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
是错别字并改正了。
我有两个 类、Foo
和 Bar
。它们都包含指向 Baz
对象的指针。我希望 Foo 实例和 Bar
实例中的 Baz
指针指向同一个 Baz
对象。
一个 Baz
对象有一个名为 name 的成员,具有 getter 和 setter 函数。
一个 Foo
对象包含一个 Bar
对象。
一个 Bar
对象有一个方法来打印 Baz
对象的名称。
Baz
对象名称必须设置在 Foo
的范围内。
这是我试过的:
在Foo
的构造函数中,设置了这个bazA
的名字,并且设置属于bar
的bazB
等于[=27] =]属于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();
程序崩溃,因为name成员在属于Bar
对象的Baz
对象中还没有被初始化。
但是属于 Bar
的 Baz
对象应该是属于 Foo
的同一个 Baz
对象,它已经设置了名称,所以它应该可以工作.
为什么会出现此错误?
如何在 Foo
和 Bar
类 之间正确共享 Baz
对象?
您必须共享对象的代码是正确的: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
}
相反,您应该在 Foo
中有一个 Baz
的对象,并与 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
是错别字并改正了。