2016-08-28 3 views
0

Надеюсь, этот вопрос не слишком субъективен, так как меня действительно интересует «хороший» подход, и я не нашел то, что искал в Интернете ... Поэтому у меня есть класс C++, не слишком сложный, но с кучей атрибутов. Теперь, когда я хочу, чтобы инициализировать их все с помощью конструктора класса, я в конечном итоге с чем-то вроде этого:Лучшая практика для инициализации нескольких атрибутов класса в C++

ADynamicGameMode::ADynamicGameMode() : NumSpawnPoints(0), 
             ChallengeRating(0), 
             MinNumberOfBadBugsOnMap(0), 
             MaxNumberOfBadBugsTotal(0), 
             NumberOfBadBugsSpawned(0), 
             NumberOfBadBugsKilled(0), 
             BadBugSpawnInterval(0), 
             CommonSpidersKilled(0), 
             PoisonousSpiderKilled(0), 
             SniperSpiderKilled(0), 
             BigAssSpiderKilled(0), 
             MinChallengeRating(CR_MIN), 
             MaxChallengeRating(CR_MAX), 
             SpawnIntervalBaseValue(10), 
             MinBadBugsBaseValue(2), 
             MaxBadBugsBaseValue(10), 
             SpawnIntervalLoopModifier(0.5), 
             SpawnIntervalCrModifier(1.0), 
             MinBadBugsCrModifier(1.0),             MaxBadBugsCrModifierCommon(0.8),           MaxBadBugsCrModifierPoisonous(1.0), 
             MaxBadBugsCrModifierBigAss(1.3), 
             MaxBadBugsCrModifierSniper(1.5), 
             CommonCrBoundary(0), 
             PoisonousCrBoundary(20), 
             BigAssCrBoundary(40), 
             SniperCrBoundary(55), 
             FireflyPawn(nullptr), 
             BP_CommonSpider(nullptr), 
             BP_PoisonousSpider(nullptr), 
             BP_BigAssSpider(nullptr), 
             BP_SniperSpider(nullptr) 
{ 
    LastBadBugSpawnTime = std::numeric_limits<float>::lowest(); 
} 

Я чувствую, что это не правильный способ в C++ делать то, что я хочу. Как вы справляетесь с таким длинным списком атрибутов - или существует даже «путь C++»?

+0

"Я чувствую, что это не правильный способ в C++ делать то, что я хочу." - и вы чувствуете, что путь, потому что ..? Это * является правильным способом сделать это, если вы надеетесь (a) иметь правильные начальные значения и (b) хотите избежать инициализации по умолчанию, за которой следует не менее длинный список прямых назначений (который сам по себе не является вариантом для члены, которые являются либо 'const', либо ссылками). Стоит учесть, действительно ли охватывающий класс действительно * хорошо разработан с 30 + переменными-членами. Возможно, подумайте над этим. – WhozCraig

+0

@WhozCraig: Я ждал этого комментария ... Ну, я понимаю, что вы спрашиваете, имеет ли смысл такой большой список переменных-членов. Для многих случаев я соглашался с вами, но в этом случае я этого не делаю. Поскольку этот класс делает не что иное, как отслеживание различных статистических данных о текущей программе (игре), более или менее совокупность глобальных счетчиков и тому подобное. В нашем случае не имеет смысла разделить это на несколько классов и/или структур. – Matthias

+0

До тех пор, пока вы понимаете, что вы являетесь вашими членами по умолчанию, * затем * direct-assigning, если вы перемещаете это вниз в тело конструктора и что некоторые члены var types * не могут * сделать это, что вы выбираете, тебе. Не существует реального повышения производительности для встроенных типов. [Отличная статья здесь] (https://isocpp.org/wiki/faq/ctors#init-lists). Ответ Алока на [этот вопрос] (http://stackoverflow.com/a/8523361/1322972), в частности раздел о том, когда вы * должны * использовать member-initializaiton, одинаково хорош. – WhozCraig

ответ

1

Рассмотрим default member initialization:

class ADynamicGameMode 
{ 
private: 
    NumSpawnPoints = 0; 
    ChallengeRating = 0; 
    .... 

или

class ADynamicGameMode 
{ 
private: 
    NumSpawnPoints {0}; 
    ChallengeRating {0}; 
    .... 
+0

Позор мне, довольно очевидно. Большое спасибо! – Matthias

Смежные вопросы