2012-05-08 14 views
0

これは大丈夫ですか?基本的には、すべてのゲームエンティティとロジックをカプセル化するクラスによって、グローバルを参照する単一の関数への呼び出しを置き換えます。次に、mainで新しいクラスを呼び出す方法は、これに関する一般的なC++の統一コンセンサスが何であるか疑問に思っています。C++デザインパターン

class thingy 
{ 
public: 
    thingy() 
    { 
     loop(); 
    } 
    void loop() 
    { 
     while(true) 
     { 
      //do stuff 

      //if (something) 
       //break out 
     } 
    } 
}; 

int main (int argc, char * const argv[]) 
{ 
    thingy(); 
    return 0; 
} 
+2

「ループ」はそれ自身の機能ではないのですか? –

+1

太陽の下でメインを行うのではなく、コンストラクタから呼び出される太陽の下のすべてを行う別の関数をカプセル化したクラスを作成しましたか?私はこれをデザインパターンと呼んでいません。 – AJG85

+0

何が問題なのですか? –

答えて

9

それはゲーム/イベント/ ...ループが含まれているコンストラクタを持つことが一般的ではないですが、そのようなものを行うための通常の方法では、オブジェクトを設定し、その後、別のを提供するために、コンストラクタを使用することですメソッドは、長い熟考を開始します。このような

何か:

class thingy 
{ 
public: 
    thingy() 
    { 
     // setup the class in a coherent state 
    } 

    void loop() 
    { 
     // ... 
    } 
}; 

int main (int argc, char * const argv[]) 
{ 
    thingy theThingy; 
    // the main has the opportunity to do something else 
    // between the instantiation and the loop 
    ... 
    theThingy.loop(); 
    return 0; 
} 

実際には、ほとんどすべてのGUIフレームワークは、ちょうどそのように振る舞う「アプリケーション」オブジェクトを提供します。例えば。 Qtフレームワーク:

int main(...) 
{ 
    QApplication app(...); 
    // ... perform other initialization tasks ... 
    return app.exec(); // starts the event loop, typically returns only at the end of the execution 
} 
+0

ループ()がコンストラクタで呼び出されないようにして、クラスthingyのインスタンスを作成してから、そのオブジェクトに対してループを呼び出すのが最善でしょうか? –

+0

これは通常の方法です。 –

+0

私は再び遅すぎるように見えます! – dreamlax

7

私はC++の第一人者ないんだけど、私はおそらく代わりに、このようにそれを行うだろう:

struct thingy 
{ 
    thingy() 
    { 
     // set up resources etc 
    } 

    ~thingy() 
    { 
     // free up resources 
    } 

    void loop() 
    { 
     // do the work here 
    } 
}; 

int main(int argc, char *argv[]) 
{ 
    thingy thing; 
    thing.loop(); 
    return 0; 
} 

コンストラクタは、オブジェクトを構築するためではなく、アプリケーション全体のを処理するためのものです論理。同様に、コンストラクタで取得したリソースは、必要に応じてデストラクタで適切に処理する必要があります。

関連する問題