0

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

1 回答 1

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 {
    // ...
}

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

于 2012-05-12T09:11:58.867 回答