如何在传入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> ¶ms) { 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
相关产品推荐
相关产品推荐

