静态类是否也受到保护?因为没有对象可以实例化,所以必须继承它。我只想确保无法访问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 :(得分: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
,然后再声明这些成员' d只想从儿童(即不是从外面)访问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
的对象。