如何在两个 类 之间共享一个对象

How to share an object between two classes

我有两个 类、FooBar。它们都包含指向 Baz 对象的指针。我希望 Foo 实例和 Bar 实例中的 Baz 指针指向同一个 Baz 对象。

一个 Baz 对象有一个名为 name 的成员,具有 getter 和 setter 函数。

一个 Foo 对象包含一个 Bar 对象。

一个 Bar 对象有一个方法来打印 Baz 对象的名称。

Baz 对象名称必须设置在 Foo 的范围内。

这是我试过的:

Foo的构造函数中,设置了这个bazA的名字,并且设置属于barbazB等于[=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对象中还没有被初始化。

但是属于 BarBaz 对象应该是属于 Foo 的同一个 Baz 对象,它已经设置了名称,所以它应该可以工作.

为什么会出现此错误?

如何在 FooBar 类 之间正确共享 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");
}

这里我假设ClassPublic是错别字并改正了。