2016-09-22 10 views
-1

私は長い間C++について勉強していましたが、まだほとんど書いていません。だから、現代​​的なC++の練習については十分に知っているにもかかわらず、私はまだ良いデザインパターンを持っていません。このテンプレートをデザインに反映させないでください。

ここに問題があります:ゲームボード(チェス、ゴーなど)を表すクラスBoardがあるとします。このボードの基礎となるストレージはstd::arrayです。

Boardを所有し、スコアを保ち、ゲームのルールを実行しているを担当している別のクラスGameRunnerなど

ゲームボードは、ユーザーによって定義された大きさを持ってあります。私の頭の中で、GameRunnerは単にGameRunner::GameRunner(unsigned size)と宣言され、sizeのパラメータも同様にボードに渡され、それはBoard::Board(unsigned size)と宣言されています。

std::arrayは、静的に決定されたサイズでなければならないという問題があります。だから私はstd::arrayというメンバ変数を持つことはできません。コンパイル時にサイズが分からないからです。私はstd::unique_ptrをメンバーとして作成し、そのポイントを動的に作成された配列にすることができると思ったが、もちろんstd::unique_ptr<std::array<???????>>を定義する必要がある。疑問符はどうしてこの配列のサイズがわからないのかを示す。

私の解決策は、ボードにサイズを渡すテンプレートがあるようにすることでした。だからにはBoard<size>がありますが、GameRunnerにもテンプレートが必要なので、テンプレートがすべてダウンしています...

ここで私は何をしますか?テンプレートは一番下にありますか?サイズは変わらないはずですが、可変サイズのコンテナを使用しますか?信じられないくらい些細なものがあるように感じます。

+0

あなたはボードにベクトルサイズを持たせることができます...簡単なコードと時間の短縮のためにランタイム速度差を測定する –

答えて

2

この状況のた​​めのコンテナをC++標準に追加するという提案がありました。そのコンテナは、構築時にサイズが決定され、その後は決して変更されません。それは拒否されましたが、あなたが望むならあなた自身のものを書くのはかなり簡単です。また、std::vectorを使用して、必要ないか気にしない機能を持っていることを実感してください(ただし、問題は起こりそうもありません)。

+0

誰かが好奇心が強い場合には、問題のコンテナは[std :: experimental :: dynarray](http://en.cppreference.com/w/cpp/container/dynarray)です。 – Drop

2

std::array<T, N>の代わりにstd::vector<T>を使用してください。

+0

私はstd :: vectorが解決策であると認識しています。しかし、学習のために、私はcomiletimeの代わりに実行時に定義されたサイズを持つ固定サイズのスタックベースの配列を作成するより良い方法があるかどうかを知りたいと思っています。方法がなく、 'std :: vector'だけが唯一の方法ならば、私はそれで生きるでしょう。 – andy

+0

実行時に定義されたサイズのスタックベースの配列を持つことは許されていますが、オブジェクトのサイズが可変になり、物事を非常に複雑にするため、オブジェクトに入れることはできません。たとえば、そのようなオブジェクトの配列を作成することはできません。また、スタックは通常ヒープよりもはるかに小さいので、ヒープ上に大きなオブジェクトを割り当てる方が良いと考えています。したがって、スタック上に配列を配置することはできず、Boardクラス内に直接配置することはできません。それがヒープ上にある場合、std :: vectorは最も自然で簡単な解決策です。 –

+2

@AlexeyGuseynov "実行時に定義されたサイズのスタックベースの配列を持つことは許されています" IINMは厳密に言えばC99では許されていますがC++では許されません。 'g ++'がそれをサポートしているのは事実ですが、それは移植性のないコンパイラ固有の言語拡張です([here](http://stackoverflow.com/questions/20010716/gnu-compilers-vs-visual-studio-on- array-allocated-w-length-constant-w-in-a-sc))。 –

関連する問題