2012-05-12 1 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

내 생각과 통신하지 않는 수있는 방법은 소켓 멤버에 액세스 없음이 있는지 확인하려면? 자바 배경에서 오는가? 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; 
} 
,369을

이 클래스가 이러한 가상 메서드를 구현하지 않는 이상 더 이상이 클래스 또는 파생 클래스의 인스턴스를 만들 수 없습니다. 대안으로 모든 생성자를 private 또는 protected으로 숨길 수 있습니다.

이미했던 것처럼 당신은 단지 아이들에서 액세스하고 싶은 당신이에서 (그러나 나는 그 멤버를 선언하는 대신 다음 public을 사용하는 것이 좋습니다 것, 즉 private 또는 protected을 사용하지 않을 수 있습니다, 기본 클래스 '회원의 가시성을 제한하려면 바깥 쪽)은 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의 객체를 생성 할 수 있습니다.

관련 문제