在静态函数中无法访问非静态成员

Non-static members not accessible in static function

本文关键字:访问 静态成员 静态函数      更新时间:2023-10-16

我定义了一个函数

HRESULT AMEPreviewHandler:: CreateHtmlPreview()
{
    ULONG  CbRead;
    const int Size= 115000;
    char Buffer[Size+1];
    HRESULT hr = m_pStream->Read(Buffer, Size, &CbRead ); 
    //this m_pStream is not accessible here even it is declared globally. the program is asking me to 
    // declare it static because this CreateHtmlPreview() function called 
    //inside the Static function (i mean here :-static CreateDialogWM_CommandCreateHtmlPreview();)
    //but if i declare it static the two problems arised are 
    //(1.) It is not able to access the value of the m_pStream which is defined globally.
    //(2.)If i declare it static globally then there are so many other function which are using this
    // value of m_pStream are not able to access it because they are non static.  
}

在我的程序中,它被声明为静态,如下所示:

static HRESULT CreateHtmlPreview(); //i have declared it static because i am calling this function from DialogProc function.If i dont create it static here it dont work
//The function CreateHtmlPreview() is called inside the DialogProc function like this-
BOOL CALLBACK AMEPreviewHandler::DialogProc(HWND m_hwndPreview, UINT Umsg, WPARAM wParam, LPARAM lParam) 
{......
case WM_COMMAND:
{  
    int ctl = LOWORD(wParam);
    int event = HIWORD(wParam);
    if (ctl == IDC_PREVIOUS && event == BN_CLICKED ) 
    {                       
        CreateHtmlPreview(); //here i am calling the function
        return 0;
    }  
}

}

那么,如何使非静态m_pStream的值在静态CreateHtmlPreview()函数定义中可访问呢?

在静态类函数中,您只能访问静态类成员。

如果使CreateHtmlPreview()成为一个自由函数会怎样?
如果你让它只创建一个html预览(而不是从流中读取),会怎么样?

void CreateHtmlPreview(const char * buffer, int size)
{
  //...
}

然后从proc读取数据,并在DialogProc 中调用它

//...
m_pStream->Read(Buffer, Size, &CbRead ); 
CreateHtmlPreview(Buffer, Size);

不过,您可能需要让函数返回预览才能使用。
你确实说你需要让它成为

静态,因为我正在从DialogProc函数调用此函数

但是,DialogProc不是静态的(在您发布的代码中),所以我看不出会有什么问题。

难道不能直接将m_pStream var作为函数参数传递吗?

而不是用这种方式定义功能

HRESULT AMEPreviewHandler:: CreateHtmlPreview()
{
    ULONG  CbRead;
    const int Size= 115000;
    char Buffer[Size+1];
    HRESULT hr = m_pStream->Read(Buffer, Size, &CbRead );
}

你可以这样做(你应该定义流类型!)

HRESULT AMEPreviewHandler:: CreateHtmlPreview(stream)
{
    ULONG  CbRead;
    const int Size= 115000;
    char Buffer[Size+1];
    HRESULT hr = stream->Read(Buffer, Size, &CbRead );
}

并称之为

CreateHtmlPreview(m_pStream);

DoctorLove我已经解决了这个问题,实际上是通过使用这个参数访问非静态变量的想法来解决代码-问题是我没有在WM_INITDIALOG中初始化实例,现在我这样做了-

case WM_INITDIALOG: 
            {
                instance = (AMEPreviewHandler*)lParam;
                instance->m_pStream;
return0;
}

而且效果很好。