0

おいおい。クラスを定義するときに悪名高い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;
}

* .cppNiall のソリューションを表示するように変更された更新。編集:

質問:

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

4

1 に答える 1