2016-08-28 13 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

メンバーをコンストラクタ本体に移動して、メンバーのvar型*でそれを行うことはできません。あなたへ。組み込み型の場合、実際のパフォーマンスヒットはありません。 [優れた記事はこちら](https://isocpp.org/wiki/faq/ctors#init-lists) Alokの[この質問](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

関連する問題