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

时间:2018-03-27 21:56:42

标签: c++ pointers object instances

我有两个班级,FooBar。它们都包含指向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>

为什么我收到此错误?

如何在BarBaz类之间正确分享Foo个对象?

1 个答案:

答案 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");
}

我假设ClassPublic是拼写错误并进行了纠正。