ここで混乱していると思いますか?Javaのバックグラウンドから来ていますか?C ++では、「静的クラス」は名前空間を定義する別の方法に似ています。クラスメンバーのアクセシビリティを制限するために使用する必要があるものは何もありません(基本的に「実際の」クラスメンバーではないため)。
もう少し正確に言うと、キーワードを使用しても、結果のコードにはまったく影響しません。「静的クラス」と見なされるのは、通常、static
メンバーのみのクラスです。
キーワードの使用方法はstatic
、クラスとオブジェクトを同時に定義できるという単純な事実のために機能します。
static class ClassOfStaticObject {
ClassOfStaticObject() {
// ...
}
} myObject;
これはこれと同じになります:
class ClassOfStaticObject {
ClassOfStaticObject() {
// ...
}
};
static ClassOfStaticObject myObject;
やりたいことを実現するには、純粋仮想関数のメンバーを使用して基本クラスを抽象化するだけです。
class Socket {
Socket(void);
Socket(PORT);
~Socket(void);
// ...
virtual int send(const char *data) = 0;
virtual int recv(const char *data) = 0;
}
これにより、このクラスまたは派生クラスのインスタンスを作成できなくなります。ただし、そのクラスがこれらの仮想メソッドを実装している場合を除きます。private
別の方法として、すべてのコンストラクターをまたはとして非表示にすることができますprotected
。
基本クラスのメンバーの表示を制限するために、使用するprivate
かprotected
、すでに行ったようにすることができますが、public
代わりに使用してから、子供からのみ(つまり外部からではなく)アクセスしたいメンバーをとして宣言することをお勧めしますprotected
。
class Socket {
protected:
Socket(void);
Socket(PORT);
~Socket(void);
// ...
virtual int send(const char *data) = 0;
virtual int recv(const char *data) = 0;
void something_protected();
public:
void something_debug(void);
}
class ServerSocket : public Socket {
// ...
}
このようにして、クラスのオブジェクトを呼び出すことはできますがsomething_debug()
、外部ServerSocket
から呼び出すことも、クラスのオブジェクトを作成することもできません。something_protected()
Socket