2017-05-07 96 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(); 
... 

錯誤:

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

當在取消存儲器*的MemoryManager =新存儲器();代碼工程雖然。 (所以我猜內存類無法找到pHandle)

回答

0

你可能現在想通了,但我會回答,無論爲未來的讀者。

如果您使用C++ 11(或更高版本),並希望簡單地初始化procHandlenull

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

大功告成。

我認爲你混淆了兩個不同的pHandle標識符。在main()中定義了pHandle,但它是一個局部變量,與錯誤引用的Global::Settings::pHandle不同。您尚未爲後者提供代碼,因此根據錯誤,您尚未將其初始化爲Global.cppSettings.cppGlobal::Settings的cpp文件)。

的修補程序確保Global::Settings::pHandle初始化在相關cpp文件:

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

另外,初始化一流:

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

Memory.h,你初始化procHandleSettings::pHandle,根據錯誤以及您似乎在做什麼來表明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; 
//...