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

如何在传入Game类实例后调用其内部对象的方法?

如何通过Game实例访问其内部创建的对象?

你现在遇到的问题核心很明确:你在Game构造函数里创建的Obstacle和Street是构造函数内的局部变量,它们只会在构造函数执行期间存在,函数结束后就会被销毁,而且Game类本身根本没有持有这些对象的成员变量,所以Build类自然没办法通过Game实例访问到它们。

下面是一步步的解决方案:

1. 给Game类添加成员变量保存目标对象

首先要修改Game.h,在Game类中添加私有成员变量来存储你需要的Sep::Property对象,同时提供公共的访问接口(遵循封装原则,不要直接暴露成员变量):

class Game {
public:
    // 保留原有的构造和析构函数
    Game(Sep::Interface &io, std::string config);
    ~Game() noexcept;

    // 提供访问内部Property对象的接口
    // 如果只需要读取,返回const引用更安全
    Sep::Property& getStreet() { return street_; }
    const Sep::Property& getStreet() const { return street_; }
    
    Sep::Property& getObstacle() { return obstacle_; }
    const Sep::Property& getObstacle() const { return obstacle_; }

private:
    std::string config_;
    // 声明成员变量,用来存储你需要的Property实例
    Sep::Property obstacle_;
    Sep::Property street_;
};

2. 修改Game构造函数,初始化成员变量

原来的构造函数是创建局部变量,现在要改成初始化类的成员变量。推荐用构造函数初始化列表的方式(如果Sep::Property没有默认构造函数,这是必须的):

Game::Game(Sep::Interface &io, std::string config) 
    : config_(config),
      // 直接初始化成员变量,用你原来的参数
      obstacle_(Sep::Field::FieldType::WATER,"OBSTACLE", 'O', true, false, 10, 20),
      street_(Sep::Field::FieldType::WATER,"STREET", 'S', true, false, 20, 10)
{
    // ... 保留原来的其他逻辑代码
}

3. 在Build的execute方法中访问Game的内部对象

现在你就可以通过Game实例调用我们定义的访问接口,拿到对应的Sep::Property对象,进而调用它的方法了:

int Build::execute(Game &game, std::vector<std::string> &params) {
    if(params.size() == 4 ) {
        // 获取Game中的street对象(引用方式,避免拷贝)
        Sep::Property& street = game.getStreet();
        // 现在可以调用street的任意成员方法了,比如假设Property有个use()方法:
        // street.use();
        
        // 如果需要访问obstacle对象同理:
        // Sep::Property& obstacle = game.getObstacle();
        // obstacle.someMethod();
    }
    // 根据你的业务逻辑返回对应值
    return 0;
}

额外注意点

  • 如果Sep::Property是不可拷贝或移动的类型,要确保成员变量的初始化方式正确,必要时可以改用指针或智能指针(比如std::unique_ptr<Sep::Property>)来存储。
  • 严格遵循封装原则:如果不需要外部修改这些对象,就返回const引用,避免意外修改内部状态。
  • 如果你需要管理多个同类型的对象(比如多条Street),可以改用容器类,比如std::vector<Sep::Property>,然后添加对应的添加、查找接口。

内容的提问来源于stack exchange,提问作者zwerg4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:52:50