我的问题应该很简单,我花了最后几个小时试图通过在我自己(和谷歌搜索)的答案中找出答案而无处可寻。
我的头文件中有以下内容:
Window.hpp
typedef struct {
SDL_Window* window = 0;
const char* title = 0;
int width;
int height;
int flags;
} m_windowStruct;
typedef std::map<std::string, m_windowStruct> m_windowMap;
m_windowMap windowMap; /* <-- Made this accessible */
在我的源文件中,我有以下代码:
Window.cpp
bool Window::createWindow(std::string id, const char* title, int width, int height, int flags) {
m_windowMap* windowMap;
m_windowStruct windowData;
windowData.window = SDL_CreateWindow("insert window creation info here");
if (!windowData.window) {
windowData.title = title;
windowData.width = width;
windowData.height = height;
windowData.flags = flags;
windowMap->insert(m_windowMap::value_type(id, &windowData));
SDL_LogInfo(INFO, "Window creation successful");
return true;
}
else {
return false;
}
};
哪个都很好用,花花公子...我遇到的问题是在之后访问映射的struct成员。
例如,如果我想要主窗口的实例,我想要以下功能:
/* Returns the window instance from the mapped struct */
SDL_Window* Window::getWindow(std::string id) {
m_windowMap::const_iterator keyValuePair = windowMap.find(id); /* <-- New error: Error: expression must have a class type */
if (keyValuePair == windowMap.end()) { /* <-- same error as just above */
return 0;
}
return keyValuePair->second.window; /* <-- Same error as just above */
};
我不能为我的生活弄清楚如何访问第二个window
成员,以便我可以将它提供给我的渲染器!
有什么想法吗?
答案 0 :(得分:2)
我想你希望windowMap
是一个可以跨多个源文件(即.cpp)访问的全局变量。以下是您需要进行的更改,
在标头文件中,将最后一行替换为extern m_windowMap* windowMap;
。这使得包含标题的所有源文件都可以访问变量。
在您的主要功能(或任何适当的地方)中,添加此行以初始化地图windowMap = new m_windowMap();
删除m_windowMap* windowMap;
函数中的Window::createWindow
,否则重新声明会创建一个新的本地m_windowMap
,其余功能对全局windowMap
无效。
最后,由于全局windowMap
是指针,因此.find()
函数中的.end()
和->find()
更改为->end()
和getWindow
。
答案 1 :(得分:0)
如果windowMap
确实是Window
的类成员,那么它实际上更容易,更清晰。
从您最初发布的代码中,删除m_windowMap* windowMap;
功能中的Window::createWindow
。否则insert
将转到此新创建的本地地图。另外,将->insert
更改为.insert
,因为您没有将windowMap
声明为标题中的指针。