【问题标题】:Function Calling Inheritance C++函数调用继承 C++
【发布时间】:2016-06-06 11:40:54
【问题描述】:

好吧,首先继承不是我的强项,这就是我在这里的原因。不过我会尽力解释。

我在 Class 2 中调用 Class 1 的函数,Class 2 是 Class 1 派生的,Class 2 是 Class 3 的基类。

在执行程序时,它是在 WinMain() 中调用的类 3。

我会证明代码总是这样有意义:

void SRNTY_API Direct3D11::D3D11ResizeBuffers(HWND hwnd)
{
    RECT rect;
    GetWindowRect(hwnd, &rect);
    mRenderTargetWidth = rect.right - rect.left;
    mRenderTargetHeight = rect.bottom - rect.top;

    if (mDXGISwapChain != NULL)
    {
        assert(mD3D11DeviceContext);
        assert(mD3D11Device);
        assert(mDXGISwapChain);

        if (mD3D11DeviceContext)
        {
            mD3D11DeviceContext->ClearState();
        }
        if (mD3D11RenderTargetView)
        {
            mD3D11RenderTargetView->Release();
        }
        if (mD3D11DepthStencilView)
        {
            mD3D11DepthStencilView->Release();
        }

        if (FAILED(result = mDXGISwapChain->ResizeBuffers(1, mRenderTargetWidth, mRenderTargetHeight,
            DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH)))
        {
            SRNTY::ErrorHandler::Instance()->AddError(L"Direct3D11::D3D11ResizeBuffers() - ID3D11Device::CreateRenderTargetView() failed to create render target view!",
                SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR);
        }

        if (FAILED(result = mDXGISwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mD3D11RenderTargetView)))
        {
            SRNTY::ErrorHandler::Instance()->AddError(L"Direct3D11::D3D11ResizeBuffers() - ID3D11Device::CreateDepthStencilView() failed to create depth stencil view!!",
                SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR);
        }

        if (FAILED(result = mDXGISwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&mD3D11DepthStencilView)))
        {
            SRNTY::ErrorHandler::Instance()->AddError(L"Direct3D11::D3D11ResizeBuffers() - ID3D11Device::CreateDepthStencilView() failed to create depth stencil view!!",
                SRNTY::ErrorHandler::ErrorHeaderSelect::EHS_ERROR);
        }

        D3D11_VIEWPORT viewport;
        ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

        viewport.TopLeftX = 0;
        viewport.TopLeftY = 0;
        viewport.Width = mRenderTargetWidth;
        viewport.Height = mRenderTargetHeight;
        viewport.MinDepth = 0.0f;
        viewport.MaxDepth = 1.0f;

        if ((mD3D11DeviceContext != NULL) && (mD3D11RenderTargetView != NULL) && (mD3D11DepthStencilView != NULL))
        {
            mD3D11DeviceContext->OMSetRenderTargets(1, &mD3D11RenderTargetView, mD3D11DepthStencilView);
            mD3D11DeviceContext->RSSetViewports(1, &viewport);
        }
    }
}

上述函数旨在重新调整 IDXGISwapChain* 缓冲区的大小。所以这必须在 WM_EXITSIZEMOVE 上调用。该函数属于上述 blabba 的 1 类。

因此,使用上述函数类作为基础的下一个类现在在 WM_EXITSIZEMOVE 上调用它,代码如下:

LRESULT Window::MsgProc(__in HWND hWnd, __in UINT message,
    __in_opt WPARAM wParam, __in_opt LPARAM lParam)                 
{
    switch (message)
    {
    case WM_KEYDOWN:                                                                    
    {
        if (wParam == VK_ESCAPE)                                                        
        {
           PostQuitMessage(0);
        }
    }

    case WM_MENUCHAR:                                                                   
    {
        return MAKELRESULT(0, MNC_CLOSE);                                       
    } break;

    case WM_DESTROY:                                                                        
    {
        PostQuitMessage(0);                                                             
    } break;

    case WM_ENTERSIZEMOVE:                                                          
    {

    } break;

    case WM_EXITSIZEMOVE:                                                               
    {
        D3D11ResizeBuffers(hWnd);    // heres is the above function being called as mentioned on WM_EXITSIZEMOVE
    } break;

    case WM_GETMINMAXINFO:                                                          
    {

    } break;
    }
    return DefWindowProc(hWnd, message, wParam, lParam);
}

然后将这两个类添加到 Engine 类,然后将其添加到 Application 类。该应用程序是 WinMain() 的前端类。

现在发生的实际上并不是缓冲区正在调整大小,而是 Direct3D11::D3D11ResizeBuffers() 正在通过调用 GetWindowRect(hwnd, &rect); 获得窗口滞留。并将结果存储在 RECT rect 中;。

然而,当我们到达这条线时,mRenderTargetWidth = rect.right - rect.left;。它基本上说 mRenderTargetWidth “抛出异常:写访问冲突。这是 0x8。”。当我调试程序时,我注意到 Direct3D11 类的所有成员都说以下内容:

结果无法读取内存
mhWnd 无法读取内存
mRenderTargetWidth 无法读取内存
mRenderTargetHeight 无法读取内存
mDXGISwapChain 无法读取内存
mDXGIDevice 无法读取内存
mDXGIAdapter 无法读取内存
mDXGIFactory 无法读取内存
mD3D11Device 无法读取内存
mD3D11DeviceContext 无法读取内存

mD3D11RenderTargetView 无法读取内存
mD3D11DepthStencilView 无法读取内存

所以实际上班级已经换了尿布,所以像这样->mD3D11Device 为 NULL。

可以说我在这里非常困惑。我真的需要帮助来解释我做错了什么或关于如何解决这个问题的建议将不胜感激。如果需要任何进一步的信息,请询问,我会提供。

感谢阅读,希望大家可以帮忙:)

【问题讨论】:

标签: c++ windows class inheritance


【解决方案1】:

好吧,我只是太笨了,只需在 Direct3D11 类的头文件中创建一个全局对象即可解决问题:

extern SRNTY_API Direct3D11& pDirect3D11;

这使我能够在任何 cpp 文件中创建一个对象,如下所示:

Direct3D11& pDirect3D11 = Direct3D11::Direct3D11();

所以我每次都使用同一个实例,好吧,我认为这就是我不太喜欢考虑实例和继承的问题。

但如果有人遇到同样的问题,这就是答案。祝大家好运\o/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-14
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2011-01-08
    • 1970-01-01
    相关资源
    最近更新 更多