我需要修改一個開源項目來防止重用代碼(更有效的方法是創建一個GetGameRulesPtr()函數,而不是繼續引擎來檢索它。問題是,它存儲爲void ** g_pGameRules。我從來沒有真正掌握指針的指針的概念,我有點困惑。如何爲雙指針創建一個getter函數?
我創建一個GetGameRules()函數來檢索這個指針,但我不知道如果我的getter函數應該是void * ret鍵入然後返回* g_pGameRules,或者我應該怎麼去做這件事,其實我現在正在刷我的指針用法,但是想找出正確的方法來學習
這裏是代碼58- 89是檢索g_pGame的SDK函數規則遊戲引擎的指針。其他功能是我添加getter函數。
// extension.cpp
class SDKTools_API : public ISDKTools
{
public:
virtual const char *GetInterfaceName()
{
return SMINTERFACE_SDKTOOLS_NAME;
}
virtual unsigned int GetInterfaceVersion()
{
return SMINTERFACE_SDKTOOLS_VERSION;
}
virtual IServer *GetIServer()
{
return iserver;
}
virtual void *GetGameRules()
{
return *g_pGameRules;
}
} g_SDKTools_API;
// extension.h
namespace SourceMod
{
/**
* @brief SDKTools API.
*/
class ISDKTools : public SMInterface
{
public:
virtual const char *GetInterfaceName() = 0;
virtual unsigned int GetInterfaceVersion() = 0;
public:
/**
* @brief Returns a pointer to IServer if one was found.
*
* @return IServer pointer, or NULL if SDKTools was unable to find one.
*/
virtual IServer* GetIServer() = 0;
/**
* @brief Returns a pointer to GameRules if one was found.
*
* @return GameRules pointer, or NULL if SDKTools was unable to find one.
*/
virtual void* GetGameRules() = 0;
};
}
// vglobals.cpp
void **g_pGameRules = NULL;
void *g_EntList = NULL;
void InitializeValveGlobals()
{
g_EntList = gamehelpers->GetGlobalEntityList();
char *addr;
#ifdef PLATFORM_WINDOWS
/* g_pGameRules */
if (!g_pGameConf->GetMemSig("CreateGameRulesObject", (void **)&addr) || !addr)
{
return;
}
int offset;
if (!g_pGameConf->GetOffset("g_pGameRules", &offset) || !offset)
{
return;
}
g_pGameRules = *reinterpret_cast<void ***>(addr + offset);
#elif defined PLATFORM_LINUX || defined PLATFORM_APPLE
/* g_pGameRules */
if (!g_pGameConf->GetMemSig("g_pGameRules", (void **)&addr) || !addr)
{
return;
}
g_pGameRules = reinterpret_cast<void **>(addr);
#endif
}
爲什麼不把代碼作爲問題的一部分包含進來,以便無論當天的貼紙消失,代碼都會保留爲其他人發現此問題的記錄? – Flexo 2010-11-16 00:50:31
對不起,我想我選擇了這個選項,以便ampaste永遠不會刪除我的帖子,但它看起來像我點了一個月。 – 2010-11-16 00:57:12