2012-05-12 3 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.

Чтобы ограничить видимость членов базовых классов, вы можете использовать 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.

Смежные вопросы