おいおい。クラスを定義するときに悪名高いLNK2005
エラーに遭遇しましたが、問題を特定できないようです。
(組織をよく反映するために、私の同様に悪名高いシングルトンを引き裂いています。)最初のシングルトンは... ...非常に分岐した、素晴らしい方法で... C++ OPPの原則をすべて回避するようにコーディングされました当時は知らなかったコンセプトですが、うまくいきました!....何とかして。最も単純な C++ の概念のまぐれではありますが。高速に動作させるには、編成、コンパイル速度、および高度な構造化手法が必要です。
A-とにかく。それを分割し、いくつか書き直さなければならなかった後、私は必要性に気づきました。複数の.cpp
ファイルを宣言する必要があるのは、単純に、二重宣言と通常のヘッダー クラス定義によってコンパイラが非常にイライラするからです。
さらに、必要に応じてプリプロセッサ ディレクティブを使用しました。しかし、まだ何かが間違っています。
注(編集):エラーが発生するように質問を書き直しました。
検討:
D3D.h
#include "Infinity.h"
class Direct3D :
public Infinity
{
public:
Direct3D();
~Direct3D();
IDXGISwapChain *Swapchain; //Display modes.
static ID3D11Device *Device;
static ID3D11DeviceContext *DeviceContext;
static ID3D11RenderTargetView *RenderTargetView;
void D3D_Start(float width, float height);
void D3D_Render();
void D3D_Terminate();
void ViewPort(float Height, float Width, float MaxDepth, float MinDepth, float TopLeftX, float TopLeftY);
}Direct3D;
...とWindows.h
#include "Infinity.h"
class Windows :
public Infinity
{
public:
Windows();
~Windows();
bool DisplayWindow(int width, int height, HINSTANCE hInstance);
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
}Windows;
ついに、Infinity.h
#pragma once
class Infinity{
public:
Infinity();
~Infinity();
static HWND hWnd;
};
すべての実装はそれぞれの .cpp ファイルにあります。その上#pragma
、私は使用しました#ifndef
... #endif
. ヘッダー ファイル内のクラスを自動初期化することによって、ある種の実装をうっかり呼び出しているのではないかと思います。しかし、それは非常にコーシャに見え、関数メンバーを次のように宣言できます。
Direct3D.D3D_Start()
静的メンバーを指定せずに、Direct3D::D3D_Start()
. ヘッダーはすべて静的にする必要がありますか?
編集:以下、.cpp
ファイル:
#include "stdafx.h"
#include "Infinity.h"
#include "Windows.h"
#include "Direct3D.h"
MSG msg;
float width = 1024;
float height = 768;
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
windows.DisplayWindow(1280, 900, hInstance);
direct3D.D3D_Start(width, height);
direct3D.ViewPort(height, width, 1.0f, 0.0f, 0, 0);
while (WM_QUIT != msg.message){
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else{
direct3D.D3D_Render();
}
}
direct3D.D3D_Terminate();
return msg.wParam;
}
* .cpp
Niall のソリューションを表示するように変更された更新。編集:
質問:
Stack Overflow question の解決策を考慮して、ヘッダーファイルでクラスを自動初期化したため、LNK2005の問題が発生していますか?
#pragma once および #ifndef の使用中に VS 2010 C++ LNK2005 エラーが発生する
私のソリューションの理解に基づいて、これはうまくいかないようです。
コンパイラ
VS2013 の戻り値:
Error 1 error LNK2005: "class Direct3D Direct3D" (?Direct3D@@3V0@A) already defined in Direct3D.obj C:\Users\InfinityMachine\documents\visual studio 2013\Projects\Win32Project3\Win32Project3\Win32Project3.obj Win32Project3
Error 2 error LNK2005: "class Windows Windows" (?Windows@@3V0@A) already defined in Win32Project3.obj C:\Users\InfinityMachine\documents\visual studio 2013\Projects\Win32Project3\Win32Project3\Windows.obj Win32Project3
Error 3 error LNK1169: one or more multiply defined symbols found C:\Users\InfinityMachine\documents\visual studio 2013\Projects\Win32Project3\Debug\Win32Project3.exe 1 1 Win32Project3