访问typedef map结构中的成员?

时间:2015-04-08 03:57:23

标签: c++

我的问题应该很简单,我花了最后几个小时试图通过在我自己(和谷歌搜索)的答案中找出答案而无处可寻。

我的头文件中有以下内容:

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成员,以便我可以将它提供给我的渲染器!

有什么想法吗?

2 个答案:

答案 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声明为标题中的指针。