なぜ誰も保護されたコンストラクタを宣言しますか?私は、コンストラクタがスタックでの作成を許可しないという目的で非公開と宣言されていることを知っています。保護されたコンストラクタの実用的な用途は何ですか?
答えて
クラスが抽象クラスである場合、保護されたコンストラクタはまさに正しいクラスです。そのような状況では、クラスからオブジェクトをインスタンス化するのではなく、それを継承するためにオブジェクトを使用するだけです。
ある種の構築パラメータを派生クラスに限定する必要がある場合など、他の使用例があります。
1つの用途は、そのコンストラクタを使用して保護されたコンストラクタのみ派生メンバーは、クラス(および派生インスタンス)のインスタンスを構築することができることを意味する工場パターン
とすることができます。これはちょっとした鶏と卵が聞こえますが、クラスファクトリを実装するときに便利なことがあります。
技術的には、これはすべてのctorが保護されている場合にのみ適用されます。 – MSalters
フレンドクラスは保護されたコンストラクタ(派生クラスだけでなく)を呼び出すこともできます。 –
...保護されたコンストラクタを呼び出すフレンドクラスの使用は、定数(コンストラクタによって設定される)を持ち、パブリックである必要があるが他のパブリックアクセスによって決して設定されないメンバを持つオブジェクトの場合には、オブジェクトはどこか他の場所に作成されることはありません。そのため、データは他の場所でも変更されません。 – osirisgothra
サブクラスがインスタンシエーターが直接アクセスできないコンストラクターを使用できるようにする。
次の例のように、それを作成することができ、クラスを制限するためにそれを使用することができます。それのインスタンスを作成することができます
class Level
{
private:
Level();
¨Level();
friend class LevelManager;
};
唯一のクラスはLevelManagerクラスですので、あなたは常にレベルということを知っているだろうインスタンスがLevelManagerで作成されます。
trueの間、それは保護されていないプライベートコンストラクタです。 – David
ahaha申し訳ありませんが、私は間違っています。私の投稿を削除しますか? –
非公開コンストラクタは、コンストラクタによってのみ保証されることができない構築要件がある場合に便利です。たとえば、コンストラクタの直後に初期化メソッドを呼び出す必要がある場合や、オブジェクトがコンテナ/マネージャオブジェクトに登録する必要がある場合は、コンストラクタの外側で初期化メソッドを実行する必要があります。コンストラクタへのアクセスを制限し、ファクトリメソッドのみを提供することで、ユーザが受け取るインスタンスがすべて保証されることを保証することができます。これは一般に、シングルトンを実装するためにも使用されます。シングルトンは、実際にはクラスが保証する単なるインスタンスです(単一のインスタンスのみが存在する)。
コンストラクタをプライベートではなく保護する理由は、プライベートではなく他のメソッドまたはフィールドをprotectedにする理由と同じです。つまり、子によって継承されるようになります。おそらく、派生クラスのインスタンスへの参照を返す、基本クラスにpublicで非仮想のファクトリメソッドが必要な場合があります。派生クラスは明らかに親コンストラクタへのアクセスを必要としますが、それでもあなたのファクトリの外にそれらを作成したくないのです。
副作用のある工場メソッドの場合。
class mine {
private:
mine() {};
protected:
mine(int id) : m_id(id) {};
int m_id;
static int m_count;
public:
static mine* CreateOneOfMe() {
return mine(m_count++);
}
int GetId() { return m_id; }
};
これは、クラスのインスタンスを作成し、それぞれが固有の増分整数IDを持つことを保証します。使用するコンストラクタがデフォルトでない場合は、デフォルトも非表示にする必要があります。
保護されたコンストラクタを使用して、そのメソッドのどれもが純粋仮想でないときにクラスを効果的に抽象化することができます。
友人のクラスでも上書きせずにそのまま使用できるので、C++の意味では抽象的ではありませんが、宣言する必要があります。
- 1. 保護されたコンストラクタとMustInherit/Abstractクラス
- 2. 保護されたコンストラクタを持つシングルトンクラス
- 3. Jacksonと保護されたコンストラクタをデシリアライズ
- 4. C#で保護されたコンストラクタを呼び出す方法は?
- 5. 保護された文が実行されないのはなぜですか?
- 6. ビットアレーの一般的な用途は何ですか?
- 7. Derby DBのVARCHARではなくLONG VARCHARの実用的な用途は何ですか?
- 8. クラスを生成する際に保護されたコンストラクタを適用する
- 9. 保護されたコンストラクタと純粋な仮想デストラクタ
- 10. 保護されたクラスが使用されていないコンパイル時の保護されたエラー[VB.net]
- 11. キーボードポーリングの用途は何ですか?
- 12. Clojureメタデータの用途は何ですか?
- 13. SetWriteDeadlineの用途は何ですか
- 14. ConcurrentBag <T>の実際の用途は何ですか?
- 15. 収量の実際の用途は何ですか?
- 16. Unityを使用して保護されたコンストラクタにパラメータを挿入することはできますか?
- 17. ASP.NET Handler(.ashx)ファイルの目的と用途は何ですか?
- 18. 保護された静的メンバー変数
- 19. 商用ソフトウェアのバイナリを逆コンパイルから保護するために使用される保護機構は何ですか?
- 20. パスワードで保護された私的なもの
- 21. 基本的なPHPのパスワードで保護されたウェブページ
- 22. 春のプロジェクトでAOPの最も一般的な用途は何ですか
- 23. Webアプリケーション - パスワードで保護されたディレクトリで保護されていますか?
- 24. IPM.Noteとは何ですか?その用途は何ですか?
- 25. @privateとは何ですか?その用途は何ですか?
- 26. Androidアプリ用の安全な/保護されたコンテンツ配信
- 27. パスワードで保護されたウェブコンテンツ - 基本的な質問
- 28. セキュリティで保護されたモジュールを使用する
- 29. シェルスクリプトの条件に使用される様々な種類のブレースの異なる用途は何ですか?
- 30. 「敵対的な」環境に配備されたシステムの保護
+1しかし、必ずしも抽象クラスである必要はありません。しかし、それはしばしばケースです。 – ralphtheninja
基本クラスを定義するために関数を純粋仮想として宣言するだけでは不十分ですか?または、上記は純粋な仮想関数がない場合です。そのような抽象クラスの派生クラスの作成イベントとは何ですか? –
@Henk Holterman C++標準のセクション10.4「抽象クラス」を参照してください。 –