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

时间:2013-07-22 13:54:51

标签: c++ winapi dialog static-methods static-members

我已经定义了一个函数

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 CreateDialog\WM_Command\CreateHtmlPreview();)
    //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()的值可访问?

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你不能只将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);

答案 2 :(得分:0)

如果您使CreateHtmlPreview()成为免费功能怎么办?
如果你只是创建一个html预览(而不是从流中读取)怎么办?

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

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

中调用它
//...
m_pStream->Read(Buffer, Size, &CbRead ); 
CreateHtmlPreview(Buffer, Size);

您可能需要让函数返回预览才能使用。
你说你需要做到这一点

  

static因为我从DialogProc函数调用此函数

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

答案 3 :(得分:0)

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

case WM_INITDIALOG: 
            {

                instance = (AMEPreviewHandler*)lParam;
                instance->m_pStream;
return0;
}

它工作正常。