【问题标题】:error C2248 : cannot access protected member declared in class错误 C2248:无法访问在类中声明的受保护成员
【发布时间】:2014-07-06 00:23:26
【问题描述】:

我对派生类的私有函数中使用的基类的受保护构造函数有疑问:

基类:

class Socket 
{

    public:
    virtual ~Socket();
    // Constructors :
    Socket();

  protected:
    Socket(SOCKET& s);
 };

派生类:

    class Server : public Socket 
    {
    public:

         Server();
        ~Server();
    private: 
        int ServerLoop();
    };

我尝试在 ServerLoop 函数中创建 Socket 对象

SOCKET client_sock = accept( m_socket, ( sockaddr* )&client_addr, &size );
Socket* Client = new Socket( client_sock );
^^^^^^

但我得到这个错误:

error C2248: 'NET_SOCKETS::Socket::Socket' : cannot access protected member
declared in class 'NET_SOCKETS::Socket'

在行过^^^^。是什么导致了这个错误?

【问题讨论】:

  • 首先,问问自己你是否真的需要使用动态内存。这可能会消失或为您提供更好的设计问题线索。

标签: c++ constructor protected


【解决方案1】:

因为它是一个构造函数,这让我有点惊讶,但它与非静态成员函数的原理相同。受保护的基类非静态成员函数只能在派生类的实例上调用(或再次从该类派生),否则只需从基类派生即可访问任何派生类的受保护功能。

解决方法就是这样做,派生一个专门用于调用受保护基类构造函数的类。

例如,替换

Socket* Client = new Socket( client_sock );

struct DSocket: Socket
{
    DSocket( SOCKET const socket )
        : Socket( socket )
    {}
};

Socket* Client = new DSocket( client_sock );

【讨论】:

    猜你喜欢
    • 2017-09-21
    • 2014-01-10
    • 2016-12-02
    • 1970-01-01
    • 2012-11-15
    • 2015-11-29
    • 2013-07-28
    • 2011-09-06
    相关资源
    最近更新 更多