如何在Foo与Bar类间共享同一Baz对象?
解决方案:实现Foo、Bar与Baz的共享对象设计
我来帮你落地这个需求,直接上可运行的C++代码示例,再拆解每个关键设计细节:
#include <iostream> #include <string> #include <memory> // 用智能指针自动管理内存,避免泄漏 // Baz类:封装name成员及getter/setter方法 class Baz { private: std::string name; public: // 获取name的只读方法 std::string getName() const { return name; } // 设置name的方法 void setName(const std::string& newName) { name = newName; } }; // Bar类:持有Baz指针,实现打印name的功能 class Bar { private: std::shared_ptr<Baz> bazPtr; public: // 构造函数:传入共享的Baz指针 Bar(std::shared_ptr<Baz> baz) : bazPtr(baz) {} // 打印Baz对象的name void printBazName() const { std::cout << "当前Baz的name值:" << bazPtr->getName() << std::endl; } }; // Foo类:内部包含Bar对象,同时持有共享的Baz指针 class Foo { private: std::shared_ptr<Baz> bazA; Bar bar; // 内部嵌入的Bar对象 public: // 构造函数:创建Baz实例,同时初始化内部的Bar Foo() : bazA(std::make_shared<Baz>()), bar(bazA) {} // 在Foo作用域内设置Baz的name void setBazName(const std::string& targetName) { bazA->setName(targetName); } // 提供访问内部Bar的接口(用于测试验证) Bar& getInnerBar() { return bar; } }; // 测试逻辑 int main() { Foo fooInstance; // 完全在Foo的作用域内设置Baz的name fooInstance.setBazName("共享的Baz实例"); // 调用Bar的打印方法,验证两者指向同一个Baz对象 fooInstance.getInnerBar().printBazName(); return 0; }
核心设计思路拆解
- 共享Baz对象:Foo构造时通过
std::make_shared<Baz>()创建唯一的Baz实例,同时将这个智能指针传递给内部的Bar对象,确保Foo和Bar的Baz指针指向同一块内存 - Foo内嵌Bar:Bar作为Foo的私有成员变量,在Foo的构造阶段完成初始化,严格符合“Foo类内部包含Bar对象”的需求
- 遵循封装原则:Baz的
name设为私有成员,仅通过getName()和setName()方法访问,避免直接操作内部数据 - 安全内存管理:使用
std::shared_ptr替代原始指针,无需手动释放内存,彻底避免内存泄漏风险;如果必须用原始指针,记得在Foo的析构函数中delete bazA,同时确保Bar不会重复释放该指针
运行结果
执行代码后,控制台会输出:
当前Baz的name值:共享的Baz实例
内容的提问来源于stack exchange,提问作者Blue7
相关产品推荐
相关产品推荐

