【问题标题】:How to share an object between two classes如何在两个类之间共享一个对象
【发布时间】:2018-03-27 21:56:41
【问题描述】:

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

Baz 对象有一个名为 name 的成员,其中包含 getter 和 setter 函数。

Foo 对象包含 Bar 对象。

Bar 对象具有打印Baz 对象名称的方法。

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

这是我尝试过的:

Foo的构造函数中,设置这个bazA的名字,并将属于barbazB设置为等于属于FoobazA

//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();

程序崩溃是因为名称成员尚未在属于Bar 对象的Baz 对象中初始化。

但是属于BarBaz 对象应该与属于FooBaz 对象相同,后者已经设置了名称,所以它应该可以工作。

为什么会出现这个错误?

如何在FooBar 类之间正确共享Baz 对象?

【问题讨论】:

  • 在某些时候您需要实际分配Baz 对象。
  • 我有 edited your post 为类名添加一些格式以使其更清晰,并且我还更正了您的 ClassPublic 的拼写错误,因为它们似乎与问题无关被问到。如果我做错了,请随时将它们原样添加。

标签: c++ pointers object instances


【解决方案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
}

相反,您应该只在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 是错别字并更正了它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多