【问题标题】:Object with private constructor and a static container (map) of itself? [closed]具有私有构造函数和自身静态容器(映射)的对象? [关闭]
【发布时间】:2016-10-14 13:08:38
【问题描述】:

我想要一个对象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'    

【问题讨论】:

  • 您需要发布minimal reproducible example。尽管您的错误似乎很明显,而且很常见,但如果没有minimal reproducible example,则无法确认。
  • 请查看URL,这将有助于提高您的内容质量
  • 恕我直言,您的问题既好又有趣,但复制粘贴编译器错误消息 fast 以满足每个人的要求,避免重新打开轮次。
  • 在标准 C++ 中,您不能让一个类包含自身的映射(静态或非静态)。另一种方法是在实现此类的.cpp 文件中将map 设为静态变量
  • @peterh 是的,我也看不出有什么问题。特别是因为标题是导致问题的原因,而不是实现。尽管如此,当它被搁置时我正在睡觉。哦,好吧

标签: c++ constructor static private encapsulation


【解决方案1】:

std::map 不能仅仅因为它恰好有一个 std::map&lt;something&gt; 类型的静态成员而获得对类的私有成员的特殊访问权。

您不能仅仅将std::map 声明为朋友,因为不能保证构造函数和析构函数实际上是由std::map 的成员调用的。这个任务很可能被委派给内部实现类或独立函数。

即使你设法结交了必要的朋友,这对你也没有多大好处,因为任何人都可以声明相同类型的 std::map 并在他们自己的映射中创建你的类的对象。

我建议只公开构造函数和析构函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多