具有私有构造函数的对象和自身的静态容器(映射)?

时间:2016-06-14 00:32:57

标签: c++ constructor static private encapsulation

我想要一个对象HIDDevice来保持自身的静态std::map。但是,当构造函数和析构函数变为私有时,下面的类会导致编译错误,如下所示:

class HIDDevice
{
public:
    static HIDDevice* getDevice(unsigned short vendorID, unsigned short productID);

    int writeData(const unsigned char *data, int length);
    int readData(unsigned char *data, int length);

private:
    static std::map<std::string, HIDDevice> m_hidDevices;
    static bool isInitialized;
    static void initHIDAPI();


    HIDDevice(){};
    HIDDevice(unsigned short vendorID, unsigned short productID, std::string serialNumber = "");
    HIDDevice(std::string path);
    ~HIDDevice();

};  

修改

错误消息如下:

error C2248: 'HIDDevice::HIDDevice' : cannot access private member declared in class 'HIDDevice'    

1 个答案:

答案 0 :(得分:1)

std::map无法获得对您班级私人成员的特殊访问权限,因为它恰好具有std::map<something>类型的静态成员。

您不能仅仅将std::map声明为朋友,因为我无法保证std::map成员实际调用构造函数和析构函数。此任务可以委派给内部实现类或独立函数。

即使你以某种方式管理必要的朋友,它也不会给你带来太多好处,因为任何人都可以声明同样的std::map并在他们自己的地图中创建你班级的对象。

我建议公开构建器和析构函数。