1

私はゲームのフレームワークを読んでいますが、次Door structのような内部がありRoom classます:

#include <vector>

class Room{
public:
    struct Door{
        unsigned name;
        unsigned orientation;
        Room* room1;
        Room* room2;
    };
    std::vector<Door*> adjacent;
};

クラス内で構造体を定義する目的は何ですか? また、構造体が定義されているアクセス修飾子によって違いはありますか?

4

4 に答える 4

5

クラス内で構造体を定義する目的は何ですか?

ただの入れ子型です。

また、構造体が定義されているアクセス修飾子によって違いはありますか?

Doorが宣言されている場合、このクラスの外privateで型の変数を宣言しようとすると、エラーが発生します。Room::Door

于 2012-04-09T17:43:10.400 に答える
1

その意図は、その型のインスタンスが周囲のクラスによって所有されるだけでなく、型自体も周囲のクラスによって所有される型を作成することです。

明らかな例として、ほとんどのコンテナ タイプは、そのコンテナのタイプをiteratorネストされたクラス (または構造体) として定義します。vector<T>::iteratorとは同様の概念を表していdeque<T>::iteratorますが、それぞれは関連付けられたコンテナー タイプによって所有され、固有のものです。

アクセス指定子に関する限り、それらは通常の規則に従います。構造体/クラス定義を作成するprivateと、同じクラス内の他のコードからのみ可視になります。の場合protected、そのクラスとその子孫に表示されます。公開の場合は、誰でも見ることができます。

より具体的な例を挙げると、ビジネスのポジションについては、次のような場合があります。

class secretary  {};

class executive {
   class secretary {};
};

この場合、a::secretaryは「通常の」秘書であり、anexecutive::secretaryは重役秘書です。明らかに似ていますが、重役秘書は通常、非重役秘書とは少なくともいくらか異なる職務記述書を持っています。エグゼクティブ バイス プレジデントには、1 人のエグゼクティブ セクレタリーと 2 人の「通常の」セクレタリーがいる場合がありますが、下位レベルのマネージャーには、通常のセクレタリーのみが許可されており、エグゼクティブ セクレタリーは許可されていません。

実際のプログラミングでは、多くの場合、入れ子になったプライベート クラスがあります。通常の秘書とはまったく異なる重役の秘書とは異なり、これらのいくつかは、世界の他の地域では存在すらまったく知られていないものです (少なくとも、見ない限り)。もちろん、ヘッダーのプライベート部分で)。

于 2012-04-09T17:45:43.253 に答える
1

クラス内で構造体を定義する目的は何ですか? また、構造体が定義されているアクセス修飾子によって違いはありますか?

目的に関して同じ回答をする人は 2 人もいませんが、その効果がどのようなものかをお伝えすることができます。

  • Room のスコープでは、クラスを Door として参照できます。

  • Room のスコープ外では、クラスを Room::Door として参照する必要があります

  • はい、型の可視性はクラス メンバーと同じであり、private、protected、public によって影響を受けます。

于 2012-04-09T17:51:44.720 に答える
0

簡単な答え:デフォルトのアクセスを除いて、C++でもまったくstruct同じことをclass意味します。Doorは単なるネストされたクラスです。言い換えると:

struct Door{
    ...

と同じです:

class Door{
    public:
    ...

ネストクラスは、組織的および文書化の理由で役立ちます。名前空間に似ていますがnamespace、C++よりも前のものです。

于 2012-04-09T17:42:29.527 に答える