2016-02-24 4 views
0

Ладно, сначала наследование - это не моя сильная сторона, поэтому я здесь. Однако я объясню, что я могу.Функция Calling Inheritance C++

Я вызов функции из класса 1 класс 2, класс 2 является производным от класса 1 и класса 2 является базовым классом для класса 3.

После выполнения программы это класс 3, который называется в WinMain().

Ill показать код всегда имеет смысл, что путь:

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. Эта функция будет находиться в пределах класса 1 из вышеупомянутого blabba.

Так что в следующий класс, который использует выше функции класса как основы теперь называет это на 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); 
} 

Оба этих классов, затем добавляются к классу двигателей, который затем добавляется к классу 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 Уну BLE читать память
mD3D11DeviceContext Невозможно чтение из памяти

mD3D11RenderTargetView Невозможно прочитать память
mD3D11DepthStencilView Невозможно чтение из памяти

Так в действительности класс имеет diapered так как this-> mD3D11Device является NULL.

Можно с уверенностью сказать, что здесь я смущен. Мне действительно нужна помощь, объясняя, что я делаю неправильно, или предложения относительно того, как я могу решить эту проблему. Если кто-то нуждается в дополнительной информации, просто спросите, и я дам.

Спасибо за чтение, и я надеюсь, что люди могут помочь :)

+1

Пожалуйста, прочитайте ['Как спросить'] (http://stackoverflow.com/help/how-to-ask), чтобы максимально использовать SO. – StoryTeller

ответ

1

Ok я просто был очень глуп и был в состоянии решить эту проблему, просто создав глобальный объект обратно в файл заголовка класса Direct3D11:

extern SRNTY_API Direct3D11& pDirect3D11; 

Это позволяет мне тогда создать объект в любом файле CPP, как это:

Direct3D11& pDirect3D11 = Direct3D11::Direct3D11(); 

Так им, используя тот же экземпляр каждый раз, ну я думаю, вот мне не очень нравится думать о примерах, и наследование немного пугает мой разум.

Но если у кого-то такая же проблема, это ответ. Удачи всем остальным там \ o/