2016-06-14 5 views
0

Ich hätte gerne ein Objekt, HIDDevice, das eine statische std::map von sich behauptet. die Klasse unterhalb Ergebnisse in Kompilierungsfehlern Wenn jedoch die Konstruktoren und Destruktoren sind privat gemacht, wie unten dargestellt:Objekt mit privatem Konstruktor und einem statischen Container (Map) von sich selbst?

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(); 

}; 

EDIT

Fehlermeldungen sind wie folgt:

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

Was sind Fehler? – P0W

+4

Sie müssen ein [mcve] posten. Obwohl Ihr Fehler offensichtlich und ziemlich häufig ist, kann er ohne [mcve] nicht bestätigt werden. –

+0

Bitte überprüfen Sie diese [URL] (http://StackOverflow.com/Help) es wird nützlich sein, Ihre Content-Qualität –

Antwort

1

std::map doesn Wenn Sie ein statisches Member vom Typ std::map<something> haben, erhalten Sie keinen speziellen Zugriff auf private Member Ihrer Klasse.

Sie können std::map nicht einfach als Freund deklarieren, da es keine Garantie gibt, dass Konstruktoren und Destruktoren tatsächlich von Mitgliedern von std::map aufgerufen werden. Diese Aufgabe kann an eine interne Implementierungsklasse oder eigenständige Funktionen delegiert werden.

Auch wenn Sie es irgendwie schaffen, notwendige Freunde zu finden, wird es Ihnen nicht viel nützen, da jeder dann die gleiche Art von std::map deklarieren und Objekte Ihrer Klasse in seiner eigenen Karte erstellen kann.

Ich schlage vor, die Konstruktoren und Destruktoren nur öffentlich zu machen.