声明类受静电保护

declaring a class static protected

本文关键字:保护 声明      更新时间:2023-10-16

静态类也受到保护吗?因为没有对象可以实例化,它必须被继承。我只想确保无法访问套接字成员,除非它直接与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;
}

这将不再允许您创建此类或任何派生类的实例,除非该类实现这些虚拟方法。作为替代方案,您可以将所有构造函数隐藏为 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 {
    // ...
}

这样,您将能够在类 ServerSocket 的对象上调用 something_debug(),但您将无法从外部调用something_protected(),也无法创建类 Socket 的对象。