声明一个静态保护的类

时间:2012-05-12 07:05:12

标签: c++ static client-server private

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

1 个答案:

答案 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;
}

除非该类实现了这些虚方法,否则将不再允许您创建此类或任何派生类的实例。作为替代方案,您可以将所有构造函数隐藏为privateprotected

要限制基类成员的可见性,您可以使用privateprotected,但我建议您使用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的对象。