声明类受静电保护
declaring a class static protected
静态类也受到保护吗?因为没有对象可以实例化,它必须被继承。我只想确保无法访问套接字成员,除非它直接与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;
};
我认为你在这里混淆了事情?来自 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 {
// ...
}
这样,您将能够在类 ServerSocket
的对象上调用 something_debug()
,但您将无法从外部调用something_protected()
,也无法创建类 Socket
的对象。
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++:无法访问声明的受保护成员
- 在使用受保护和继承时无法访问在类中声明的私有成员
- 在带有类型保护的模板文件中使用前向声明
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 何时在抽象类 cpp 中声明受保护的字段
- 向前声明 typedef 保护
- 在派生的C 类中,访问基类受保护成员作为公共的访问声明
- 错误 C2248:无法访问类中声明的受保护成员
- 有什么方法可以在工会内部获得受保护的声明吗
- 构造函数中的C++保护声明
- 继承错误 - 无法实例化抽象类 无法访问在类中声明的受保护成员
- 声明类受静电保护
- 有没有办法从类外部声明一个受保护C++变量?
- 受保护部分中的好友声明
- 声明受保护的函数friend
- 在c++中声明类时使用私有访问说明符在内存级别提供了什么保护
- 无法访问类 'A' 中声明的受保护成员
- 不能访问类中声明的受保护成员
- 以前声明为受保护的枚举的访问枚举器