2013-12-13 16 views
0

我正在爲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(); }; 

我想實現到弩或我需要把每個佔位符函數以及? (對於多態而言並不陌生,但也沒有經歷過)謝謝!

+0

錯誤提示您違反*一個定義規則*。 IOW你不能讓一個源文件定義一個函數/方法,然後讓第二個源文件重新定義這個相同的函數。 (忽略模板)。 – greatwolf

+0

physcannon cpp中的那些函數對於physcannon的功能來說是必需的,儘管crossbow cpp可能有其自己的定義。有沒有辦法分離上下文並避免這個問題?所有的武器都是從同一個父輩繼承而來,並且還使用其他多用途類的方法,所以有很多覆蓋和多態性正在進行 – Garvin

+0

您可以添加一個簡單的類圖來顯示您的層次結構的外觀嗎?上述內容並不清楚你想要做什麼。 – greatwolf

回答

0

你不能只在include "physcannon.cpp"裏面的「crossbow.cpp」。這樣做會導致「physcannon.cpp」中的內容重複定義,這會導致您在鏈接時看到的錯誤。

如果您想要使用physcannon.cpp文件內定義的一些私有函數,請嘗試將它們移動到具有自己標題的單獨文件中。然後,您可以在「physcannon.cpp」和「crossbow.cpp」中包含標題。或者,如果函數很小,請將定義放在標題中,並使其成爲inline

如果你想要的是在你的Crossbow類中使用PhysCannon方法,那麼這將不起作用。你可以在這種情況下,最好的辦法是將這些方法移動到中間基類,像

class CHLCombatWeaponWithSomePhysics : public CBaseHLCombatWeapon 
{ 
    // Define some methods that were previously in PhysCannon 
}; 

然後同時更改physcannon和弩,使他們從這個中間類繼承。

相關問題