Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++/DX11从.h移动到.cpp会导致错误_C++_Undefined_Header Files_Directx 11 - Fatal编程技术网

C++/DX11从.h移动到.cpp会导致错误

C++/DX11从.h移动到.cpp会导致错误,c++,undefined,header-files,directx-11,C++,Undefined,Header Files,Directx 11,我正在研究一些directX,从教程代码开始,并逐渐将其转换为自己的类系统和cpp文件等 到目前为止,一切都很顺利,但我刚刚开始修改Camera.h和Camera.cpp。我在标题中有class函数,当我把它放在它的类文件中时,它会出现一个错误。我有头球拦网等,但我看不到缺陷 编辑前的camera.h 编辑后的camera.h #ifndef CAMERA_H_ #define CAMERA_H_ #include "Player.h" #include "RandomVariables.h"

我正在研究一些directX,从教程代码开始,并逐渐将其转换为自己的类系统和cpp文件等

到目前为止,一切都很顺利,但我刚刚开始修改Camera.h和Camera.cpp。我在标题中有class函数,当我把它放在它的类文件中时,它会出现一个错误。我有头球拦网等,但我看不到缺陷

编辑前的camera.h

编辑后的camera.h

#ifndef CAMERA_H_
#define CAMERA_H_
#include "Player.h"
#include "RandomVariables.h"


class Camera {
    public:
        void    UpdateCamera();
        float   camPitch;
        float   camYaw;
        float   Zoom_Amount; //zoom amount from Model_1.Player
        float   charCamDist; //distance from Model_1.Player

        XMVECTOR camPosition;
        XMVECTOR camTarget;
        XMVECTOR camUp;
        XMVECTOR camRight;
        XMVECTOR camForward;

        XMMATRIX camRotationMatrix;
        XMMATRIX Rotationx;
        XMMATRIX Rotationy;
        XMMATRIX Rotationz;
        XMMATRIX camView;
        XMMATRIX camProjection;
};

Camera MainCamera;

#endif
我删除了void Camera::UpdateCamera并将其放在Camera.cpp中,它会出现未定义的错误等等,如果void Camera::UpdateCamera在头文件中,则不会发生这些错误,因此我感到困惑:S

错误列表

移动updatecamera后的Camera.cpp

#include "Camera.h"

void Camera::UpdateCamera(){
    MainCamera.charCamDist = 135.0f;

    MainCamera.camTarget = mainPlayer.playerPos;

    MainCamera.camTarget = XMVectorSetY(MainCamera.camTarget, XMVectorGetY(MainCamera.camTarget)+5.0f); 
    MainCamera.camTarget = XMVectorSetX(MainCamera.camTarget, XMVectorGetX(MainCamera.camTarget) -MainCamera.Zoom_Amount);


    MainCamera.camRotationMatrix = XMMatrixRotationRollPitchYaw(-MainCamera.camPitch, MainCamera.camYaw, 0);
    MainCamera.camPosition = XMVector3TransformNormal(DefaultForward, MainCamera.camRotationMatrix );
    MainCamera.camPosition = XMVector3Normalize(MainCamera.camPosition);

    MainCamera.camPosition = (MainCamera.camPosition * MainCamera.charCamDist) + MainCamera.camTarget;

    MainCamera.camForward = XMVector3Normalize(MainCamera.camTarget - MainCamera.camPosition);  // Get forward vector based on target
    MainCamera.camForward = XMVectorSetY(MainCamera.camForward, 0.0f);  // set forwards y component to 0 so it lays only on
    // the xz plane
    MainCamera.camForward = XMVector3Normalize(MainCamera.camForward);
    MainCamera.camRight = XMVectorSet(-XMVectorGetZ(MainCamera.camForward), 0.0f, XMVectorGetX(MainCamera.camForward), 0.0f);

    MainCamera.camUp =XMVector3Normalize(XMVector3Cross(XMVector3Normalize(MainCamera.camPosition - MainCamera.camTarget), MainCamera.camRight));

    MainCamera.camView = XMMatrixLookAtLH( MainCamera.camPosition, MainCamera.camTarget, MainCamera.camUp );


};
随机变量


使用externs并仅在相关cpp文件中声明类对象就解决了这个问题。

Camera MainCamera;将其放在标题中会使您容易受到多定义链接器错误的影响。如果在多个源文件中包含camera.h,则会声明多个MainCamera,这将导致此类错误。事实上,这就是将会发生的事情,即使你解决了编译问题。如果它已经完成了ifndef,它就不能重新定义主摄像头了吗?在移动cameraupdate功能No之前,它包含在多个文件中。这不是将要发生的事情。您有两个单独的模块:RandomVariables.cpp和Camera.cpp。它们将单独汇编,不是吗?因此,当链接器现在看到MainCamera变量同时出现在RandomVariables和Camera对象代码中时,链接器将发出错误。停止使用全局变量,或者学习如何在多模块程序中使用它们。我的错误是标题不是cpp。正如我提到的,我正在分解教程代码并将其构建到类系统中,就像以前一样,它都在一个文件中,所有内容都是全局的,我不知道足够的DX来从头构建它。但是是的,这将是错误,因为当它打开错误时,我只在第二个cpp中调用camera.h。您能否提供一个可用的解决方案?显然,删除所有全局变量是当前的行动计划,但我在多个文件中调用MainCamera对象?外部可能会起作用?如果您使用globals,则标头中的定义应为外部,并且只有一个source.CPP模块具有非外部定义。
//Global Declarations - Interfaces//

#ifndef RAND_H
#define RAND_H
#include "Models.h"
#include "Player.h"
#include "Camera.h"

///start
My_Player   mainPlayer;

XMMATRIX WVP;

XMVECTOR DefaultForward = XMVectorSet(0.0f,0.0f,1.0f, 0.0f);
XMVECTOR DefaultRight = XMVectorSet(1.0f,0.0f,0.0f, 0.0f);

float tilt_X = 0.0f;

int NumSphereVertices;
int NumSphereFaces;

XMMATRIX sphereWorld;


XMMATRIX Scale;
XMMATRIX Translation;

///end



IDXGISwapChain* SwapChain;
ID3D11Device* d3d11Device;
ID3D11DeviceContext* d3d11DevCon;
ID3D11RenderTargetView* renderTargetView;
ID3D11DepthStencilView* depthStencilView;
ID3D11Texture2D* depthStencilBuffer;
ID3D11VertexShader* VS;
ID3D11PixelShader* PS;
ID3D11PixelShader* D2D_PS;
ID3D10Blob* D2D_PS_Buffer;
ID3D10Blob* VS_Buffer;
ID3D10Blob* PS_Buffer;
ID3D11InputLayout* vertLayout;
ID3D11Buffer* cbPerObjectBuffer;
ID3D11BlendState* d2dTransparency;
ID3D11RasterizerState* CCWcullMode;
ID3D11RasterizerState* CWcullMode;
ID3D11SamplerState* CubesTexSamplerState;
ID3D11Buffer* cbPerFrameBuffer;

ID3D10Device1 *d3d101Device;    
IDXGIKeyedMutex *keyedMutex11;
IDXGIKeyedMutex *keyedMutex10;  
ID2D1RenderTarget *D2DRenderTarget; 
ID2D1SolidColorBrush *Brush;
ID3D11Texture2D *BackBuffer11;
ID3D11Texture2D *sharedTex11;   
ID3D11Buffer *d2dVertBuffer;
ID3D11Buffer *d2dIndexBuffer;
ID3D11ShaderResourceView *d2dTexture;
IDWriteFactory *DWriteFactory;
IDWriteTextFormat *TextFormat;

IDirectInputDevice8* DIKeyboard;
IDirectInputDevice8* DIMouse;

ID3D11Buffer* sphereIndexBuffer;
ID3D11Buffer* sphereVertBuffer;

ID3D11VertexShader* SKYMAP_VS;
ID3D11PixelShader* SKYMAP_PS;
ID3D10Blob* SKYMAP_VS_Buffer;
ID3D10Blob* SKYMAP_PS_Buffer;

ID3D11ShaderResourceView* smrv;

ID3D11DepthStencilState* DSLessEqual;
ID3D11RasterizerState* RSCullNone;

ID3D11BlendState* Transparency;

#endif