2017-05-07 25 views
0

main.cppで定義されているようにこのシンボルが定義されていない理由を理解するのは難しいです。クラスを作成するときに未定義の外部シンボルが既に定義されています

メモリクラス:

#pragma once 
#include "CrownIncludes.h" 

class Memory { 
public: 
    template<typename T> 
    inline T Read(std::uintptr_t ptrAddress) const 
    { 
     T val = T(); 

     ReadProcessMemory(procHandle, (LPCVOID)ptrAddress, &val, sizeof(T), NULL); 
     return val; 
    } 
private: 
    HANDLE procHandle = Settings::pHandle; 
}; 

CrownIncludes.h

#pragma once 
#include <Windows.h> 
#include <TlHelp32.h> 
#include <Psapi.h> 
#include <iostream> 

#include "Global.h" 
using namespace Global; 

#include "Crown.h" 
#include "Memory.h" 

Crown.cpp:

#include "CrownIncludes.h" 
//#include "Memory.h" 

void Crown::Setup() { 
    std::cout << "Crown loading..." << std::endl; 
    Memory* MemoryManager = new Memory(); 

    DWORD LocalPlayer = 0x0; 
    MemoryManager->Read(0x02C8 + 0x0390, LocalPlayer); 
    std::cout << LocalPlayer << std::endl; 
} 

MAIN.CPP:

... 
    std::cout << "Success! (" << TargetProcess->GetHandle() << ")" << std::endl; 
    HANDLE pHandle = TargetProcess->GetHandle(); 

    // Main 
    Crown::Setup(); 
... 
コードは以下の通りです0

エラー:

Fehler LNK2001 Nicht aufgelöstes externes Symbol ""void * Global::Settings::pHandle" ([email protected]@[email protected]@3PEAXEA)" Crown.obj  

メモリー* MemoryManager =新しいメモリをアンコメント();コードは動作します。 (私は、メモリクラスがpHandleを見つけることができないと思います)

答えて

0

あなたはおそらくそれを今考え出したでしょうが、将来の読者には関係なく私は答えます。

あなたがC++ 11(またはそれ以降)を使用している場合や、単にnullprocHandleを初期化したい:

// (Memory.h) 
//... 
HANDLE procHandle = nullptr; 

そして、あなたは完了です。

あなたは2つの異なるpHandle識別子を混乱させると思います。 pHandlemain()に定義されていますが、エラーが参照するGlobal::Settings::pHandleとは異なるローカル変数です。あなたは後者のコードを提供していないので、エラーだけに基づいてGlobal.cpp またはSettings.cppGlobal::Settingsのcppファイル)に初期化していません。

Global::Settings::pHandleを確保されている修正プログラムが関連のcppファイルに初期化されます:

// (Global.cpp/Settings.cpp) 
//... 
HANDLE Global::Settings::pHandle = nullptr; 

また、中クラスのそれを初期化:Memory.h

// (Global.h/Settings.h) 
//... 
HANDLE pHandle = nullptr; 

、あなたがSettings::pHandleprocHandleを初期化しています、これはエラーに基づいて、あなたがそれをしているように見えるものは、Settings::pHandleがconstexprになり得ないことを示します。データメンバは、クラス内でのみconstexprの値に初期化することができます。そうでなければ、非constexprの値を実行時に読み取る必要があるため、コンストラクタを使用する必要があります。

// If Settings::pHandle is constexpr. i.e. pHandle is a nullptr alias. 
//... 
    HANDLE procHandle = Settings::pHandle; 
//... 

// If Settings::pHandle is NOT constexpr. 
//... 
    Memory() : 
     procHandle(Settings::pHandle) {} 
//... 
private: 
    HANDLE procHandle; 
//... 
関連する問題