いつでも当てはまる20個のC++テクニック<12-13>Object-oriented Design
6014 ワード
12 and 13: Object-oriented Design
C++は、procedural programming、functional programming、generic programming、object-oriented programmingなど、多くの非常に有用なプログラミングモデルをサポートしています.そのうちobject-oriented programming(オブジェクト向けプログラミング)は、最も広く使用されている例と重要な例に違いありません.次の2つのテクニックは、オブジェクト向けの設計と実装をよりよく適用するのに役立ちます.まず、クラス継承における虚析構造関数の重要性を説明します.もう1つのテクニックは、ネストされたクラスをクラスを含む友元として宣言する方法について説明します.
テクニック12:なぜ虚析構造関数のクラス継承が危険ではないのか.
クラスの構造関数が虚でない場合、つまり、ベースクラスとして使用されないことを意味します(このクラスは、私たちがよく知っている「エンティティクラス」です.).std::string,std::complex,およびstd::vectorはエンティティクラスです.なぜこれらのクラスを継承することを推奨しないのですか?共通継承を使用すると、ベースクラスと派生クラスの間にis-aの関係が作成されます.したがって、ベースクラスのポインタと参照は、実際には派生オブジェクトを指すことができます.構造関数は虚ではないため、このようなオブジェクトを削除すると、C++は構造チェーン全体を呼び出すことはありません.例:
呼び出されていないオブジェクトのプロファイルによる結果は不確定です.そのため、このようなクラスを公開的に継承するべきではありません.特に、STLコンテナとstd::stringは継承しないでください.
テクニック13:ネストされたクラスをクラスを含む友元として宣言
クラスを含む友元としてネストされたクラスを宣言する場合は、前ではなくネストされたクラス宣言の後ろに友元宣言を置く必要があります.
友元宣言をネストされたクラス宣言の前に置くと、コンパイラは友元宣言を破棄します.コンパイラはまだ見たことがないので、何なのか分かりません.
注意:ネストされたクラス定義について
A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class.
1つのclass Aが別のclass Bまたはinterface Bに定義されている場合、このclass Aはnested classであり、class Bまたはinterface Bはenclosing classと呼ばれる.class Aがclass Bやinterface Bのどこに定義されているか、例えばmethodやconstructorについては、制限はありません.
//いつでも当てはまる20のC++テクニック<14-20>STL and Generic Programming
作者:凌云健笔
出典:http://www.cnblogs.com/lijian2010/
作者の创作情热を保存するために、要求に従って【転载】要求してください:作者の同意を得ないで、必ずこの声明を保留しなければなりません;文章の中で原文の接続を提供しなければなりません;さもなくば必ず法律の责任を追及します
C++は、procedural programming、functional programming、generic programming、object-oriented programmingなど、多くの非常に有用なプログラミングモデルをサポートしています.そのうちobject-oriented programming(オブジェクト向けプログラミング)は、最も広く使用されている例と重要な例に違いありません.次の2つのテクニックは、オブジェクト向けの設計と実装をよりよく適用するのに役立ちます.まず、クラス継承における虚析構造関数の重要性を説明します.もう1つのテクニックは、ネストされたクラスをクラスを含む友元として宣言する方法について説明します.
テクニック12:なぜ虚析構造関数のクラス継承が危険ではないのか.
クラスの構造関数が虚でない場合、つまり、ベースクラスとして使用されないことを意味します(このクラスは、私たちがよく知っている「エンティティクラス」です.).std::string,std::complex,およびstd::vectorはエンティティクラスです.なぜこれらのクラスを継承することを推奨しないのですか?共通継承を使用すると、ベースクラスと派生クラスの間にis-aの関係が作成されます.したがって、ベースクラスのポインタと参照は、実際には派生オブジェクトを指すことができます.構造関数は虚ではないため、このようなオブジェクトを削除すると、C++は構造チェーン全体を呼び出すことはありません.例:
class
A
{
public
:
~
A()
//
non virtual
{
//
...
}
};
class
B:
public
A
/*
; A
*/
{
public
:
~
B()
{
//
...
}
};
int
main()
{
A
*
p
=
new
B;
/*
*/
delete p;
/*
, B
*/
}
呼び出されていないオブジェクトのプロファイルによる結果は不確定です.そのため、このようなクラスを公開的に継承するべきではありません.特に、STLコンテナとstd::stringは継承しないでください.
テクニック13:ネストされたクラスをクラスを含む友元として宣言
クラスを含む友元としてネストされたクラスを宣言する場合は、前ではなくネストされたクラス宣言の後ろに友元宣言を置く必要があります.
class
A
{
private
:
int
i;
public
:
class
B
/*
*/
{
public
:
B(A
&
a) { a.i
=
0
;};
};
friend
class
B;
/*
*/
};
友元宣言をネストされたクラス宣言の前に置くと、コンパイラは友元宣言を破棄します.コンパイラはまだ見たことがないので、何なのか分かりません.
注意:ネストされたクラス定義について
A nested class is any class whose declaration occurs within the body of another class or interface. A top level class is a class that is not a nested class.
1つのclass Aが別のclass Bまたはinterface Bに定義されている場合、このclass Aはnested classであり、class Bまたはinterface Bはenclosing classと呼ばれる.class Aがclass Bやinterface Bのどこに定義されているか、例えばmethodやconstructorについては、制限はありません.
//いつでも当てはまる20のC++テクニック<14-20>STL and Generic Programming
作者:凌云健笔
出典:http://www.cnblogs.com/lijian2010/
作者の创作情热を保存するために、要求に従って【転载】要求してください:作者の同意を得ないで、必ずこの声明を保留しなければなりません;文章の中で原文の接続を提供しなければなりません;さもなくば必ず法律の责任を追及します