0

静的クラスも保護されていますか? オブジェクトはインスタンス化できず、継承する必要があるためです。ServerSocket と直接通信しない限り、Socket メンバーにアクセスできないようにしたいだけです。

i.e.

//Socket.cpp    
static class Socket {
   Socket();
   Socket(PORT);
   ~Socket();
   int create();
   int bind();
   int listen();
   int connect();
   int close();
   int send(char* data);
   int recv(char* data);
};

//ServerSocket.cpp
class ServerSocket : private Socket {
   ServerSocket();
   ServerSocket(PORT);
   ~ServerSocket();
   close();
   send(char* data);
   recv(char* data);
};

// main.cpp
int main() {
     ServerSocket socket(30000);

     socket.send("Hello World");
     socket.close();

     return 0;
};
4

1 に答える 1

0

ここで混乱していると思いますか?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

基本クラスのメンバーの表示を制限するために、使用するprivateprotected、すでに行ったようにすることができますが、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

于 2012-05-12T09:11:58.867 に答える