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