【问题标题】:Accessing vector of pointers in a class访问类中的指针向量
【发布时间】:2016-01-14 09:09:08
【问题描述】:

我正在尝试找出一种方法来跟踪我创建的类的所有实例,以便我可以使用标题字符串(或 int ID)随时访问它们

我决定使用指向每个实例的静态指针向量,然后在创建每个实例时,我会添加一个指向该向量的指针。

这在一定程度上有效,但在某一时刻,向量的每个元素内的值似乎会重置/获得随机分配的值,我无法弄清楚发生了什么。

我在这里将对象添加到向量中:

SWindow::SWindow(LPCWSTR WindowClass, LPCWSTR Title, UINT Style, int x, int y, int height, int width, HWND hParWnd, HINSTANCE hInstance)
    :
    x(x),
    y(y)
{
    hWnd = CreateWindowEx(NULL, WindowClass, Title, Style, x, y, height, width, hParWnd, NULL, hInstance, NULL);
    SWindows.push_back(this);

值改变的函数是: 它是SWindow 类的成员

SWindow.h:

static SWindow* GetSWindow(wstring ws);

SWindow.cpp:

 SWindow* SWindow::GetSWindow(wstring ws)
{
    for (int i = 0; i < SWindow::SWindows.size(); i++)
    {
        if (SWindows[i]->title == ws)
        {
            return SWindows[i];
        }
        else
        {
        }
    }

    return 0;
}

我正在使用不同的类访问函数:

SWindow* pPlayViewer = SWindow::GetSWindow(L"Viewer");

另外,如果这是做我想做的事情的坏方法,请告诉我更好的方法。 谢谢!

【问题讨论】:

  • 您的静态变量实际上是一个全局变量,这通常是不好的代码气味。您不能将您的(非静态)向量传递给需要对其进行读/写的每个人吗?

标签: c++ class pointers vector static


【解决方案1】:

悬空指针有四个主要原因:

  • 您不会在销毁实例时从向量中删除实例

  • 您创建跨 DLL 边界的实例(并传递向量 arround)

  • 您在代码的另一部分有缓冲区溢出(或类似情况),它正在覆盖您的向量

  • 您正在从多个线程同时访问向量(并且对它的访问在您的代码中看起来并不同步)

(这都是我的猜测)。

要正确使用这样的向量,您必须执行以下操作:

  • 为您的类实现所有构造函数和析构函数(这意味着您还将根据五规则实现赋值运算符)。

  • 确保所有构造函数都将this 添加到向量中

  • 确保析构函数从向量中移除this

另外,建议的重构:

  • 将向量传递给对象,而不是将其声明为静态;这将允许您在客户端代码中决定您是否有单个向量、多个向量或某种窗口管理器对象,该对象在内部保存一个向量

  • 将窗口创建参数分组到一个结构中,并将该 arround 作为参数传递

  • 你的SWindow 类想要既是窗口管理器又是窗口;将窗口管理提取到一个单独的对象中

【讨论】:

    【解决方案2】:

    您确定没有将堆栈分配的对象添加到静态向量中吗?删除对象时是否删除了指针?

    如果你想更有效率,我可以建议你使用一个映射,其中键可以是你的标题字符串/id int,值是指针,这样搜索会比解析整个数组快得多.

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2016-05-03
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多