我有一个可以打开多个窗口的应用程序。有id
个与这些窗口关联。
我有一个map<uint, Window*>
数据结构,可以跟踪id和窗口之间的映射。
我试图返回一个我知道id的类的实例:
Window * Window::getWindow(uint id) {
map<uint, Window*>::iterator it = m_windows.find(id);
if (it != m_windows.end())
{
return it->second;
}
}
通过以下方式从另一个班级调用:
Window::getWindow(id)
我发现该函数需要声明static
才能在没有对象本身的情况下调用此函数,因此该函数声明为:
static Window * getWindow(uint id);
问题是,m_windows
不是静态的。宣布:
std::map<uint, Window*> m_windows;
因此,我无法在此功能中使用它(知情)。
我试图弄清楚我将如何能够
在此静态函数
m_windows
使此函数非静态并以不同的方式返回类实例
m_windows
也不能是静态的,因为新窗口需要能够添加到此地图中并从中删除。
谢谢
答案 0 :(得分:2)
我的建议:
将Window::getWindow
保留为static
成员函数。
将地图m_windows
作为实施细节移动到实施文件中。无需将其保留为类static
或其他类型的成员变量。
在.cpp文件中,使用:
// Function to return a reference to the map of windows, which
// is stored in a static variable in the function.
static std::map<uint, Window*>& getWindowsMap()
{
static std::map<uint, Window*> windows;
return windows;
}
将项目添加到地图时,请使用:
getWindowsMap()[id] = window;
从地图上取回项目时,请使用:
Window* window = getWindowsMap()[id];
答案 1 :(得分:0)
在我看来,使用静态是正确的方法。为了在静态方法中使用std :: map,你需要使std :: map也是静态的。
我通过创建一个带有std :: map数据成员的简单类或结构以及从地图添加/删除窗口的方法以及基于id返回窗口的方法来解决这个问题。< / p>
在创建/销毁新窗口时添加/删除地图,上面的方法可以正常工作。
仅供参考 - 如果您决定创建此类课程,http://doc.qt.io/qt-5/qglobalstatic.html可能会有所帮助。