You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:34:05