C++从全局静态函数中引用对象

C++ Referencing an Object from a global static function

本文关键字:引用 对象 静态函数 全局 C++      更新时间:2023-10-16

我有一个全局声明的静态函数,它需要引用一个对象,但当我这样做时,我会得到一个"未声明的标识符"错误。

这是我的代码示例

#pragma once
#include "stdafx.h"
#include <vector>
#include "Trigger.h"
using namespace std;
namespace Gamma_Globals
{
    static vector<void*> gvTriggers;
}
static LPARAM CALLBACK ProgramWndProc(HWND, UINT, WPARAM, LPARAM);
static LPARAM CALLBACK ProgramWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_KEYUP:
        {
            for (int i = 0; i < Gamma_Globals::gvTriggers.size(); i++)
            {
                Trigger t = Gamma_Globals::gvTriggers[i];
            }
        }
    default: return DefWindowProc(hWnd, uMsg, wParam, lParam); break;
    }
    return 0;
}

问题出现在WM_KEYUP的情况下,当我试图设置"触发器t"时,我得到错误"触发器":未声明的标识符。我该怎么做才能从ProgramWndProc引用触发器对象?

谢谢!


根据要求,这里有一份Trigger.h

#pragma once
#include "Noun.h"
#include "TermFactory.h"
#include "Globals.h"
using namespace std;
class Trigger
{
public:
    enum   TRIGGER_TYPE {NONE, ONKEYPRESS, ONMOUSEPRESS};
    Trigger(void*);
    Trigger(LPTSTR trigger, LPTSTR action, Gamma_Globals::TRIGGER_TIME);
    ~Trigger(void);
    VOID Perform();
    TRIGGER_TYPE GetType();
private:
    LPTSTR        lpCondition;
    LPTSTR        lpAction;
    Gamma_Globals::TRIGGER_TIME triggerTime;
    vector<Noun*> vNouns;
    TRIGGER_TYPE  triggerType;
    VOID LoadAction(LPTSTR Action);
    HRESULT LoadCondition(LPTSTR Condition);
};

您的trigger.h包含globals.h。globals.h inturn包含trigger.h。因此,在编译globals.h时,编译器没有看到class trigger。

理想情况下,代码中不应该有任何循环依赖项。触发器.h中的任何一个都将取决于globals.h,或者相反,而不是两者都依赖。

要编译它,可以创建global.cpp并将函数定义放入其中。请注意,这不会破坏循环依赖关系。

您尝试将类型为Trigger的void*分配给t。

由于触发器的ctor接受无效*try:

for (int i = 0; i < Gamma_Globals::gvTriggers.size(); i++)
{
    Trigger t( Gamma_Globals::gvTriggers[i] );
}