c ++中的部分向前声明

时间:2019-12-10 20:35:07

标签: c++ winapi

我有一个项目(A),该项目使用另一个(B)中的类,但是将B的标头包含在内会使A的编译非常混乱,而单独的编译效果很好(但是在这种情况下,我不能在B中使用B的类A)。

B使用VS2019的编译器v142进行编译,A使用cuda 10的nvcc进行编译。

我如何只声明几个成员,例如,构造函数,属性和方法?

在A中,我想在不使用B头的情况下使用此代码:

DX12Cuda = new DX12CudaInterop(ImUtil.ImFeatures.Width, ImUtil.ImFeatures.Height, L"DX12Cuda", funcMessage);
DX12Cuda->CuSurfaceUpdater = [&](cudaSurfaceObject_t o) {UpdateCuSurface(o); };
OnRenderDX12 = [&]() {DX12Cuda->OnRender(); };
DX12Cuda->OnInit(hwnd);

在B:

class DX12CudaInterop
{
public:
    DX12CudaInterop(UINT width, UINT height, wstring name, MessageChangedCallback managedDelegate);
    function<void(cudaSurfaceObject_t)> CuSurfaceUpdater;
    OnInit(HWND hwnd);
    OnRender();
}

void DX12CudaInterop::OnInit(HWND hwnd) {/*...*/}
void DX12CudaInterop::OnRender() {/*...*/}

错误示例:

  

严重性代码描述项目文件行抑制状态   错误标识符“ NPP_MIRROR_FLIP_ERR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 412   错误名称后跟“ ::”必须是类或名称空间   名称ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 3
  错误标识符“字节”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 29
  错误名称后跟“ ::”必须是类或名称空间   名称ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 31
  错误名称后跟“ ::”必须是类或名称空间   名称ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 41
  预期错误a   “;” ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 41
  错误标识符“文件”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 42
  错误标识符“字节”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 52
  函数声明中允许错误内联说明符   仅ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
  错误不完整类型不是   允许ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
  错误标识符“ ID3D12Object”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
  错误标识符“ pObject”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
  预期错误a   “)” ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 63
  预期错误a   “;” ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DXSampleHelper.h 64
  错误标识符“ IDXGIFactory2”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DX12CudaSample.h 30
  错误标识符“ IDXGIAdapter1”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ DX12CudaSample.h 30
  错误标识符“ NPP_BAD_ARG_ERROR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 323   错误标识符“ NPP_COEFF_ERROR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 326   错误标识符“ NPP_RECT_ERROR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 329   错误标识符“ NPP_QUAD_ERROR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 332   错误标识符“ NPP_MEM_ALLOC_ERR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 335   错误标识符“ NPP_HISTO_NUMBER_OF_LEVELS_ERROR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 338   错误标识符“ NPP_INVALID_INPUT”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 341   错误标识符“ NPP_POINTER_ERROR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 344   错误标识符“ NPP_WARNING”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 347   错误标识符“ NPP_ODD_ROI_WARNING”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 350   错误标识符“ NPP_MEMFREE_ERR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 403   错误标识符“ NPP_MEMSET_ERR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 406   错误标识符“ NPP_MEMCPY_ERR”为   未定义ShCuSum path_to_solution \ D3D12CudaUpdateFull \ helper_cuda.h 409   错误(活动)E0135类“ Microsoft :: WRL :: Details :: EnableIf”没有成员“类型” D3D12CudaUpdate C:\ Program Files   (x86)\ Windows Kits \ 10 \ Include \ 10.0.18362.0 \ winrt \ wrl \ client.h 379

1 个答案:

答案 0 :(得分:2)

您不能。您可以改用以下方法:

// interop.h, shared across the project
class iCudaInterop
{
public:
    virtual ~iCudaInterop() { }
    virtual void OnInit( HWND hwnd ) = 0;
    virtual void OnRender() = 0;
};
extern std::unique_ptr<iCudaInterop> createInterop( UINT width, UINT height, const std::wstring& name, MessageChangedCallback del );

// interop.cpp, only in project B
#include "interop.h"

class CudaInterop : public iCudaInterop
{
    DX12CudaInterop m_impl;

public:
    CudaInterop( UINT width, UINT height, const std::wstring& name, MessageChangedCallback del ) :
        m_impl( width, height, name, del ) { }
    ~CudaInterop() = default;

    void OnInit( HWND hwnd ) override { m_impl.OnInit( hwnd ); }
    void OnRender() override { m_impl.OnRender(); }
};

std::unique_ptr<iCudaInterop> createInterop( UINT width, UINT height, const std::wstring& name, MessageChangedCallback del )
{
    return std::make_unique<CudaInterop>( width, height, name, del );
}

对于该属性,最简单的方法是在实现get / set m_impl的字段中,将其包装到iCudaInterop接口的2个抽象方法中,getter和setter。