2012-05-12 107 views
0

靜態類是否也受保護?因爲沒有對象可以被實例化並且它必須被繼承。我只是想確保沒有可能的方式來訪問的Socket成員,除非它直接與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; 
} 

這將不再允許您創建此類或任何派生類的實例,除非該類實現了這些虛擬方法。作爲替代方案,您可以隱藏所有構造函數,如privateprotected

要限制基類的成員的可見性,您可以使用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類的對象。