ベースクラスを使用する場合でも、「マイ」コードだけがクラスを使用できるようにするにはどうすればよいですか? (それは基底クラスとして使用されていない場合、私はそれ私のクラスのいずれかのprivate
またはprotected
入れ子になったクラス作ることができます)プライベートベースクラスとして使用されるクラスの一般的な使用を防止する
私は私のクラスのいずれかの基底クラスの使用は単なる実装の詳細であることを示すためにしたい場合明らかでない私はBase
クラスを使用したことを、私のDerived
クラスのクライアントに
class Base
{
...
}
class Derived: private Base
{
public:
Derived(...): Base{...} {... };
...
}
::、私はプライベート基本クラスを使用することができます
#include "Derived.h"
void client() {
Derived d{...};
Base *b = static_cast< Base * >(&d);// error
...
}
しかし、それを想像しますクラスは非常に特殊化されているか、混乱している、または使用するのが難しいです。私のコードのクライアントがそれを基本クラスとして使用したり、そのクラスのオブジェクトを作成することはできません。このようなクライアントコードが失敗したので、私は、私のコードのいくつかに、それはある意味では、「プライベート」になりたい:
#include "Derived.h"
class Client: Base// error wanted here
{
public:
Client(...): Base{...} {...};
...
}
void client()
{
Derived d{...};// OK
Base b{...};// error wanted here
Client c{...};// error wanted here
}
はどのように私はそれを行うことができますか?
Java's package-private classesのように、同じ「パッケージ」(モジュール)内の他のクラスのみにアクセスできますが、「パッケージ」以外のコードでは使用できないようにするにはどうすればいいですか?
これは何も成し遂げません。クライアントは単に 'detail :: Base b = {...};'と書くことができます。 – Raedwald
@ Raedwald:いい方法はありません。 C++の開発者は、 'detail ::'と書いた場合、慣習上、すべての賭けは無効であることを知っておくべきです。 libstdC++の奇妙な実装エンティティを使用することから、あなたが今日中止することは何もありません。 –