C ++在staic函数中使用非静态变量来返回类实例

时间:2017-05-18 22:10:37

标签: c++ qt class

我有一个可以打开多个窗口的应用程序。有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也不能是静态的,因为新窗口需要能够添加到此地图中并从中删除。

谢谢

2 个答案:

答案 0 :(得分:2)

我的建议:

  1. Window::getWindow保留为static成员函数。

  2. 将地图m_windows作为实施细节移动到实施文件中。无需将其保留为类static或其他类型的成员变量。

  3. 在.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可能会有所帮助。