如何在GameState类中获取MapGraph类更新后的CurrentLocation变量值?
解决方案:获取MapGraph实例的CurrentLocation值 & 修复static变量链接错误
问题1:为什么SidePanel里拿不到更新后的CurrentLocation?
你在main里创建的MapGraph* Map和SidePanel里new MapGraph出来的是两个完全独立的对象——每个MapGraph实例都有自己的CurrentLocation成员变量,所以SidePanel里的实例只会用默认的初始值,而不是main里调用GoToLocation修改后的值。
解决方法:共享同一个MapGraph实例
有两种常用的方式让GameState访问到main里的MapGraph实例:
方式1:通过构造函数/Setter传递实例指针
首先修改GameState类,添加一个成员变量保存MapGraph的指针:
GameState.h
#pragma once // 前置声明MapGraph,避免循环依赖 class MapGraph; class GameState { public: GameState() : m_map(nullptr) {} // 构造时传入MapGraph实例 GameState(MapGraph* map) : m_map(map) {} // 或者提供Setter方法 void SetMap(MapGraph* map) { m_map = map; } void SidePanel(); private: MapGraph* m_map; };
然后在main里初始化GameState时传入已创建的MapGraph实例:
main.cpp
int main() { MapGraph* Map = new MapGraph; // 构造时传入Map实例,或者之后调用Game->SetMap(Map) GameState* Game = new GameState(Map); Map->GoToLocation(MapGraph::LocationNames::CastleSquare); Game->SidePanel(); // 记得后续要delete动态分配的对象,避免内存泄漏 delete Map; delete Game; return 0; }
最后修改SidePanel的实现,直接使用共享的实例指针:
GameState.cpp
#include <iostream> #include "GameState.h" #include "MapGraph.h" void GameState::SidePanel() { // 先做空指针检查,避免访问nullptr崩溃 if (m_map != nullptr) { std::cout << m_map->LocNamesString[(int)m_map->CurrentLocation]; } }
方式2:调用SidePanel时直接传参
如果不需要长期持有MapGraph实例,也可以在调用SidePanel时直接把实例指针传进去:
GameState.h
#pragma once class MapGraph; class GameState { public: GameState() {} // 修改SidePanel,添加参数 void SidePanel(MapGraph* map); };
GameState.cpp
#include <iostream> #include "GameState.h" #include "MapGraph.h" void GameState::SidePanel(MapGraph* map) { if (map != nullptr) { std::cout << map->LocNamesString[(int)map->CurrentLocation]; } }
main.cpp里调用时:
Game->SidePanel(Map);
问题2:static变量的链接错误LNK2001
当你把CurrentLocation声明为static时,头文件里只是声明这个静态成员,必须在cpp文件里定义它,否则链接器找不到对应的内存空间。
修改步骤:
- 在
MapGraph.h里声明静态成员:
class MapGraph { public: // 声明静态成员 static LocationNames CurrentLocation; // ...其他代码 };
- 在
MapGraph.cpp里定义并初始化这个静态成员:
#include "MapGraph.h" // 定义静态成员,这里可以指定初始值,比如默认的GraveYard MapGraph::LocationNames MapGraph::CurrentLocation = MapGraph::LocationNames::GraveYard; // ...其他成员函数的实现 MapGraph::MapGraph() { // 如果用了static,构造函数里就不用初始化CurrentLocation了(除非需要覆盖默认值) }
这样就能解决LNK2001链接错误。不过要注意:静态成员是所有MapGraph实例共享的——如果你希望每个地图实例有自己的当前位置,那还是用前面的「共享实例」方案更合适;只有当整个游戏只需要一个全局的当前位置时,才适合用static。
内容的提问来源于stack exchange,提问作者Tsubaki13
相关产品推荐
相关产品推荐

