2016-02-24 159 views
0

好吧,首先繼承不是我的強項,這就是爲什麼我在這裏。不過,我會盡我所能解釋。函數調用繼承C++

我打電話從1級的函數的2類,2類是從1類和2類衍生爲3.

類一旦程序的執行的基類是3級,其被稱爲在WinMain()中。

生病顯示它的代碼始終是有道理的方式:

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); 
} 

這兩類然後被添加到一個引擎類,然後加入到一個應用程序類。該應用程序是WinMain()的前端類。

現在發生的事情並不是緩衝區被重新調整大小,發生了什麼事情Direct3D11 :: D3D11ResizeBuffers()獲取調用GetWindowRect(hwnd,& rect)的窗口滯留;並將結果存儲在RECT矩形中。

但是,當我們到這裏這一行mRenderTargetWidth = rect.right - rect.left ;.它基本上說mRenderTargetWidth「異常拋出:寫訪問衝突,這是0x8。」當我調試程序我注意到Direct3D11類的所有成員說以下內容:

結果無法讀取內存
mhWnd無法讀取內存
mRenderTargetWidth無法讀取內存
mRenderTargetHeight無法讀取內存
mDXGISwapChain無法讀取內存
mDXGIDevice無法讀取內存
mDXGIAdapter無法讀取內存
mDXGIFactory無法讀取內存
mD3D11Device尤娜BLE讀取內存
mD3D11DeviceContext無法讀取內存

mD3D11RenderTargetView無法讀取內存
mD3D11DepthStencilView無法讀取內存

所以在效果類已經diapered所以像這個 - > mD3D11Device爲NULL。

這是非常安全的說我在這裏很困惑。我真的需要幫助,要麼解釋我做錯了什麼或建議如何我可以解決這個問題將不勝感激。如果有任何需要進一步的信息,只要問,我會給。

感謝您的閱讀,我希望人們能幫助:)

+1

請閱讀['如何問]'(http://stackoverflow.com/help/how-to-ask)以充分利用SO。 – StoryTeller

回答

1

好吧,我只是做非常愚蠢的,並能由Direct3D11類的頭文件中創建一個全局對象回來只是解決問題:

extern SRNTY_API Direct3D11& pDirect3D11; 

這使我能夠在任意一個CPP文件中像這樣創建對象:

Direct3D11& pDirect3D11 = Direct3D11::Direct3D11(); 

這樣的IM每次使用相同的實例,以及我認爲是它我真的不喜歡考慮實例和繼承讓我的腦海裏有些浮躁。

但是,如果任何人有同樣的問題,這是答案。祝你好運,其他人\