簡體   English   中英

函數調用繼承C ++

[英]Function Calling Inheritance C++

首先,繼承不是我的強項,這就是為什么我在這里。 但是我會盡力而為。

我正在從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的Class 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。

可以肯定地說我在這里很困惑。 我真的需要幫助,要么解釋我在做錯什么,要么就如何解決此問題提出建議,將不勝感激。 如果有任何需要進一步的信息,只是問,我會給。

感謝您的閱讀,希望大家能給予幫助:)

好吧,我只是非常笨,可以通過在Direct3D11類的頭文件中創建一個全局對象來簡單地解決問題:

extern SRNTY_API Direct3D11& pDirect3D11;

這樣,我便可以在任何cpp文件中創建一個對象,如下所示:

Direct3D11& pDirect3D11 = Direct3D11::Direct3D11();

所以我每次都使用同一個實例,嗯,我想就是這樣,我真的不喜歡思考實例,而繼承卻讓我有點困惑。

但是,如果有人遇到相同的問題,這就是答案。 祝其他人好運\\ o /

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM