[英]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.