2

何が起こっているかはわかっていますが、これを修正する方法がわかりません:

main.cpp

#include "Win32.h"

int main () {
    return 0;
}

Win32.h

#include <windows.h>
#include <map>

#ifndef WIN32_H_
#define WIN32_H_

namespace W32 {

class Win32;                        // Pre-Declaration
std::map<HWND, Win32 *> windowMap;  // Handle to Class instance mapping

class Win32 {
    public:

        Win32();
        virtual ~Win32();

    protected:

    private:

};  // Class Win32

} // namespace W32

#endif // WIN32_H_

Win32.cpp

#include "Win32.h"


namespace W32 {

Win32::Win32() {
}

Win32::~Win32() {
}

} /* namespace W32 */

エラー メッセージ:

    src\Win32.o: In function `Win32':
    D:\Dev\Projects\Eclipse\OpenGL3\Debug/../src/Win32.cpp:7: multiple definition of `W32::windowMap'
    src\main.o:D:\Dev\Projects\Eclipse\OpenGL3\Debug/../src/main.cpp:14: first defined here

std::map<HWND, Win32 *> windowMap;わかりました、複数のファイルに表示され、複数のファイル (main.cpp/Win32.cpp) に含まれているため、再定義されています。私はまだstd::mapに少し慣れていません。私がする必要があるのはプロトタイプwindowMapですが、私が知らないのはどのようにですか? このコードをつかんだとき、これだと思いました。Win32クラスはそれを使用できる必要がありますが、そうするには宣言する必要がありますが、私が持っているのはそれを行う方法ではありません.正しいものを探すために何を探すべきか途方に暮れています.宣言を適切に転送する方法に関する情報std::map<HWND, Win32 *> windowMap

4

3 に答える 3

4
std::map<HWND, Win32 *> windowMap; 

は定義であるため、1つの定義規則に違反しています。変数を作成する必要がありますextern

extern std::map<HWND, Win32 *> windowMap; 

単一の実装ファイルで定義します。

Win32.h

#include <windows.h>
#include <map>

#ifndef WIN32_H_
#define WIN32_H_

namespace W32 {
   class Win32;                        // Pre-Declaration
   extern std::map<HWND, Win32 *> windowMap;  // Handle to Class instance mapping
   //...
};  // Class Win32

} // namespace W32

#endif // WIN32_H_

Win32.cpp

#include "Win32.h"
namespace W32 {
   std::map<HWND, Win32 *> windowMap;  // Handle to Class instance mapping
   //...
} /* namespace W32 */
于 2012-05-27T20:31:13.670 に答える
1

以下は定義であり、宣言ではありません:

std::map<HWND, Win32 *> windowMap;

定義はcppファイルに入れられます。ヘッダーには、次のような宣言が必要です。

extern std::map<HWND, Win32 *> windowMap;

定義

std::map<HWND, Win32 *> windowMap;

cppファイルに入れる必要があります。そうしないと、定義付きのヘッダーを含む各cppファイルが独自のを定義windowMapし、リンカーエラーが発生します。

于 2012-05-27T20:31:36.277 に答える
0

純粋な C++ の方法は、次のようにすることです。

std::map<HWND, Win32 *> windowMap"

staticWin32 クラスのメンバー。file.hさらに、 with を忘れてくださいfile.cpp。単純にするために、ほぼすべてのハードコア開発者によって非推奨になっています。あなたのコードは非常に短いので、特にフレームワークをプログラミングしているように見える場合は、すべてをヘッダーに含める必要があります。

あなたの問題は、静的メンバーが C++ に存在する理由を突き止めます。さらに、このマップを定義することexternは良い習慣ではありません。実際の定義をどこかに、おそらくあまり関連性のない場所に隠す必要があるからです。

そして最後に、私はすでにこの設計を試しました.Windowsハンドラの関数は非同期的に呼び出されます...

1- 同時に複数のウィンドウがアクティブな場合、競合状態で実行されます。

2-実際には、関数を呼び出すとすぐに競合状態が実行されます。これは、背後でWindowsメッセージポンピングハンドラーを呼び出すためであり、値はまだCreateWindowわかりませんHWND

insert/read/remove3-マップ内で同時に実行しようとすると、競合状態が発生します。これは、実際には非常に一般的な操作です。

于 2012-05-28T10:48:05.150 に答える