2012-05-12 19 views
0

静的クラスも保護されていますか?どのオブジェクトもインスタンス化することができず、継承する必要があるからです。それが直接のServerSocketクラスの静的宣言

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; 
}; 
+0

あなた自身でこの質問に答えるためにコードを簡単に試してみることができます。 – EdChum

答えて

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として非表示にすることもできます。

しかし、私がいないから、すなわち(代わりにして、あなただけの子供からアクセスしたいメンバーを宣言publicを使用してお勧めしたい、あなたはすでに行ったようにあなたがprivateprotectedを使用することができ、ベースクラスのメンバーの可視性を制限します外側)は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 { 
    // ... 
} 

この方法では、クラスServerSocketのオブジェクトにsomething_debug()を呼び出すことができるでしょうが、あなたは外からsomething_protected()を呼び出すことはできませんもあなたがクラスSocketのオブジェクトを作成することができます。

関連する問題