web-dev-qa-db-ja.com

クラスを別のクラスの中に入れることはできますか?

「C++プログラミング言語」からの抜粋です

template<classT> class List { // optimal
public:
class Link { /* ... */ };
List (); // initially empty
void put(T *); // put before current element
T* get(); // get current element
/ / ...
};

別のクラス内にクラスを作成できますか?他の言語はどうですか? PHP この質問を参照

5
nischayn22

ネストされたクラスと呼ばれます。一部の言語(C++)では許可されていますが、他の言語(PHP)では許可されていません。

言語がそれをサポートすることは技術的に必要ではありませんが、場合によっては、外部の名前空間が雑然とするのを防ぐのに役立ちます。 STLの場合、イテレータなどの依存型を整理するための適切な方法になります(たとえば、以前のシグナリング機能であるlist<T>::iteratorvector<T>::iteratorではなくlist_iterator<T>vector_iterator<T>依存関係をはるかに明確に)。

14
tdammers

別のクラスの中にクラスを作成できますか?

はい、C++ではできます。ネストされたクラスと呼ばれます。ただし、このクラスはそれを含むクラスの拡張に似ているため、サブクラスがプライベートであっても、含まれているクラスメンバーにアクセスできることを忘れないでください。

https://stackoverflow.com/questions/486099/can-inner-classes-access-private-variables を参照してください…また http://codepad.org/UxxG4ixD

他の言語はどうですか?

各言語をチェックする必要がありますが、少なくともPythonこれを許可します。セマンティックは異なります。機能が言語間でまったく同じセマンティックを提供しているとは限りません。

6
Klaim

確実なこと!スコープを変更し、おそらくコードに構造を与える以外は何もしません。

また、Javaの内部クラス機能も注目に値します。これは、囲んでいるクラスのインスタンス変数にアクセスできるネストされたクラスです。例えば。内部クラスInnerを含むクラスOuterがある場合、構文Outer.this.bananaを使用して内部クラス内からOuterのフィールドにアクセスできます(Outerにフィールドbananaがある場合)。内部クラスのインスタンスを作成するには、最初に外部クラスのインスタンスが必要です。これは、内部クラスのオブジェクトがその外部クラスより長く存続できないことも意味します。これはJavaの非常に便利な機能だと思います。 Javaで通常のネストされたクラスの動作を取得するには、それを静的に宣言します。

ネストされたクラス(必ずしも内部クラスではない)のサポートを知っている他の言語は、C++、C#、およびpythonです。

0
Hannes