2017-03-07 27 views
-3

我正在學習如何爲學校製作遊戲。在這個遊戲中,我有三種不同類型的船隻:驅逐艦,航母和快艇。我會申報的EntityType枚舉:C++ - 當創建遊戲實體時,我應該使用「子類」還是結構?

enum EntityType {DESTROYER, CARRIER, SPEEDBOAT}; 

我必須有一個實體類,看起來像:

class Enitity 
{ 
private: 
    float acceleration, turnRate, maxSpeed, minSpeed; 
    std::string entityType; 
public: 
    Entity(EntityType type); 
    ~Entity(); 
    //Rest of class 
}; 


對於每種船型,它們具有不同的值。我對每種類型的船舶都有不同的價值觀,並且我正試圖想出初始化每種類型的船舶的最佳方式。我想到了這樣做的三種方法。我也在努力讓自己能夠在未來繼續發展,因爲我獲得了更多的船型。


選項1:創建擁有EntityData結構和每個船型像創建數據文件:

struct EntityData 
{ 
    float acceleration, turnRate, maxSpeed, minSpeed; 
    std::string entityType; 
}; 

EntityData DestroyerData; 
DestroyerData.acceleration = 5; 
DestroyerData.turnRate = 2; 
DestroyerData.maxSpeed = 35; 
DestroyerData.minSpeed = 0; 
DestroyerData.entityType = "Destroyer"; 

EntityData CarrierData; 
CarrierData.acceleration =2; 
..... 

則該實體類的構造函數中有一個switch語句,如果entityType是DESTROYER將類的數據設置爲結構的數據。

Entity::Entity(EntityType type) 
{ 
    EntityData data; 
    switch (type) 
    { 
    case EntityType::DESTROYER: 
     data = DestroyerData; 
     break; 
    case EntityType::CARRIER: 
     break; 
    default: 
     break; 
    } 

    acceleration = data.acceleration; 
    maxSpeed = data.maxSpeed; 
    //Rest of variables 
} 


選項2:使用繼承,使實體類的基類,並讓每個船型有它自己的類。在它的類中,只有在構造函數中初始化了這些值。

class Destroyer : public Entity 
{ 
public: 
    Entity(EntityType type); 
    ~Entity(); 
    //Rest of class 
}; 

Destroyer::Destroyer() 
    : acceleration(5), 
     maxSpeed(35), 
     //Rest of variables 
{ 
} 


方案3:通過提供實體的構造函數使用switch語句,而不是使用數據結構或繼承類基於關閉實體類型的實體類中設置的所有的信息?

Entity::Entity(EntityType type) 
{ 
    switch (type) 
    { 
    case EntityType::DESTROYER: 
     maxSpeed = 42; 
     //TODO: Set the rest of the variables for the DESTROYER 
     break; 
    case EntityType::CARRIER: 
     //TODO: Set the rest of the variables for the CARRIER 
     maxSpeed = 55; 
     break; 
    default: 
     break; 
    } 
} 


哪種方法是最好的,爲什麼?



如果反對投票 -請解釋一下你爲什麼反對投票,所以我可以提高我的問題。

+0

您會如何期待對性能產生影響? –

+0

也許是由工廠函數構造和初始化的通用「Ship」類,它根據類型(來自預定義的「船舶類型」的表或地圖,不使用switch語句或類似語言)? –

+1

如果所有的船隻都有相同的參數組,並且只有數值不同,繼承和爲每個類型定義一個自己的結構都是過度的。只需使用同一類的不同對象。 –

回答

1

利用C++ OOP的最佳方式是繼承。這將允許您使用std :: vector < * genericShip>艦隊,並將所有三種類型存儲在裏面。另外,例如,如果一艘驅逐艦能夠發射大炮,一艘航母可以發射一架飛機,但是一艘快艇無法發射,這種方法可以讓你實現每個功能。另一個優點是,如果您需要爲特定船舶單獨調整值,則可以採用這種方法,最後,您可以輕鬆添加新船。

+0

所以我應該選擇選項2? – kingcobra1986

+0

是的。稍後可能實施工廠,但從2開始 –

+0

什麼是工廠? – kingcobra1986

相關問題