我正在爲Half Life 2創建一個mod,並且想從physcannon.cpp向crossbow.cpp添加一個方法。我首先嚐試讓physcannon類成爲弩類的朋友類,其中包括crossbow cpp中的physcannon.cpp,然後在弩的一個方法內調用physcannon的方法之一,但得到下面的錯誤(這只是衆多類似的錯誤)。 Crossbow類的一部分看起來像這樣,我認爲這些錯誤是由包含兩個重疊的cpp文件引起的。是否有一種不同的C++技術可以在這裏用來調用crossbow類中的physcannon類的Force()方法?我應該如何將另一個類的方法的功能添加到我的當前類中?
class CWeaponCrossbow : public CBaseHLCombatWeapon
{
DECLARE_CLASS(CWeaponCrossbow, CBaseHLCombatWeapon);
public:
CWeaponCrossbow(void);
virtual void Precache(void);
virtual void PrimaryAttack(void);
virtual void SecondaryAttack(void);
virtual void Force(void) { CWeaponPhysCannon A; A.Force(); };
virtual bool Deploy(void);
virtual void Drop(const Vector &vecVelocity);
virtual bool Holster(CBaseCombatWeapon *pSwitchingTo = NULL);
virtual bool Reload(void);
virtual void ItemPostFrame(void);
virtual void ItemBusyFrame(void);
virtual void Operator_HandleAnimEvent(animevent_t *pEvent, CBaseCombatCharacter *pOperator);
virtual bool SendWeaponAnim(int iActivity);
virtual bool IsWeaponZoomed() { return m_bInZoom; }
1>weapon_physcannon.obj : error LNK2005: "public: static struct datamap_t * __cdecl game_shadowcontrol_params_t::GetBaseMap(void)" ([email protected][email protected]@[email protected]@XZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "private: static struct datamap_t * __cdecl CGrabController::GetBaseMap(void)" ([email protected]@@[email protected]@XZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "public: void __thiscall CGrabController::OnRestore(void)" ([email protected]@@QAEXXZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "public: virtual enum IMotionEvent::simresult_e __thiscall CGrabController::Simulate(class IPhysicsMotionController *,class IPhysicsObject *,float,class Vector &,class Vector &)" ([email protected]@@[email protected]@@[email protected]@[email protected]@[email protected]@[email protected]) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "private: virtual struct datamap_t * __thiscall CPlayerPickupController::GetDataDescMap(void)" ([email protected]@@[email protected]@XZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "public: static struct datamap_t * __cdecl thrown_objects_t::GetBaseMap(void)" ([email protected][email protected]@[email protected]@XZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "public: virtual class ServerClass * __thiscall CWeaponPhysCannon::GetServerClass(void)" ([email protected]@@[email protected]@XZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "public: virtual int __thiscall CWeaponPhysCannon::YouForgotToImplementOrDeclareServerClass(void)" ([email protected]@@UAEHXZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "public: virtual struct datamap_t * __thiscall CWeaponPhysCannon::GetDataDescMap(void)" ([email protected]@@[email protected]@XZ) already defined in weapon_crossbow.obj
1>weapon_physcannon.obj : error LNK2005: "public: virtual void __thiscall CWeaponPhysCannon::WeaponIdle(void)" ([email protected]@@UAEXXZ) already defined in weapon_crossbow.obj
編輯: 對於greatwolf:CWeaponCrossbow和CWeaponPhysCannon無論從CbaseHLCombatWeapon繼承和覆蓋功能等等等等,我試圖增加在CWeaponPhysCannon的功能之一是在使用CWeaponCrossbow類(並且最終所有其他武器也將獲得此增加的方法)。
我喜歡Tristan Brindle建議的擁有中間基類的想法,並且會嘗試這樣做。中間基類只需要
virtual void Force(void) { CWeaponPhysCannon A; A.Force(); };
我想實現到弩或我需要把每個佔位符函數以及? (對於多態而言並不陌生,但也沒有經歷過)謝謝!
錯誤提示您違反*一個定義規則*。 IOW你不能讓一個源文件定義一個函數/方法,然後讓第二個源文件重新定義這個相同的函數。 (忽略模板)。 – greatwolf
physcannon cpp中的那些函數對於physcannon的功能來說是必需的,儘管crossbow cpp可能有其自己的定義。有沒有辦法分離上下文並避免這個問題?所有的武器都是從同一個父輩繼承而來,並且還使用其他多用途類的方法,所以有很多覆蓋和多態性正在進行 – Garvin
您可以添加一個簡單的類圖來顯示您的層次結構的外觀嗎?上述內容並不清楚你想要做什麼。 – greatwolf