これは比較的単純な質問ですが、詳細は私を混乱させます。
私は次のような基本的な構造体を持っています:
struct player {
string name;
int rating;
};
そして、この構造体を利用するクラス「チーム」。これを念頭に置いて、チームのパブリック/プライベートフィールド内または別のファイル内の「プレーヤー」構造体の正しい配置はどこにありますか?また、インスタンスを作成するために私がしなければならないことは何か違うのでしょうか?ありがとう。
自問自答する必要があります。playerclass と組み合わせない限り、構造体は無意味teamですか? もしそうなら、それはおそらく内部で定義されるべきteamです; それ以外の場合は、個別に定義する必要があります。
つまり、誰かがplayerから直接取得されていないオブジェクトを使用したいと考えている場合は、独立した構造体teamを作成する必要があります。playerあなたのプログラムの背後にある一般的な構造や考え方がわからないので、直接的な回答はできません。
チーム/プレイヤー構造体の使い方によって異なります。プレーヤーがアプリケーションの他の部分で使用されている場合は、プレーヤーを独立させる必要があります。これはほとんどの場合です。
struct Player {
int rating;
std::string name;
};
class Team
{
private:
std::vector<Player> players_; // here you have a bunch of players
};
Player完全に内部で使用されTeam、誰も使用していない場合は、構造体/クラス内に配置しTeamて、名前の範囲を絞り込むことができます。
class Team
{
private:
struct Player{
int rating;
std::string name;
};
private:
std::vector<Player> players_; // here you have a bunch of players
};
クラスの前に構造体を定義するだけです。それはトリックを行う必要があります...
Player使わなくても使えるかがポイントTeamです。その場合は、別のクラスであり、ネストされていない必要があります。適切に設計された従来の (OO) ソフトウェアでは、ほとんどのネストされたクラスは、外側のクラス内で排他的に使用され、プライベートです。または、それらはプロキシであり、外部クラスの関数からの戻り値に使用されますが、外部クラスのクライアントによって宣言されることはありません。
クラスメンバークラスの他の「ビュー」を作成することもお勧めです。たとえば、コンテナへのイテレータ。イテレータをメンバーにするか、フリー クラスにするかは、何よりもスタイルの問題です (ただし、一貫性を保つ必要があります)。主に名前に影響します(ContainerIterator対Container::Iterator)。
最後に、テンプレートは別の次元を導入します。 type のテンプレートを指定するとT、このテンプレート内で、メンバー型を含む のメンバーを簡単に参照できTます。「無関係な」タイプを見つけることは不可能です。つまり、テンプレートを でインスタンス化するとT == Container、Container::Iteratorは としてすぐに利用できtypename T:Iteratorますが、 を見つける方法はありませんContainerIterator。
あなたのクラスの名前を考えると、私はそれらが独立してTeamいて1-n、Player. (また、両方ともエンティティ オブジェクトであり、コピー不可かつ割り当て不可にする必要があるのではないかと考えています。しかし、それは別の問題です。)
チームはプレイヤーの集まりだと思うので、チームを管理するために何らかのコンテナを使用すると便利です。STL
に
は多くの効率的なコンテナがあります。ニーズに最も適したものを選択するのはあなた次第です。
また、同じタスクに関連するスタッフをグループ化するには、namespaceを使用できます。