std::unique_ptr als Klassenmember einer globalen (extern) Klasse?



  • Hi,

    ich versuche gerade so langsam alle raw-pointer gegen smart-pointer zu tauschen. In einem Projekt habe ich eine globale variable einer Klasse die ich überall brauche:

    // schiff.h
    	extern Schiff schiff;
    
    	// schiff.cpp
    	class Schiff
    	{
    	private:
    		typedef std::unique_ptr<You> EmployeePtr;
    		std::unordered_map<short, EmployeePtr> employee;
    		short id;
    	public:
    		Schiff(short id) : id(id) {};
    	}
    

    Später wird in einer ganz anderen Datei die schiff variable "befüllt":

    // misc.cpp
    void irgendEineFunktion()
    {
    	schiff = Schiff(1337);
    }
    

    Beim compilieren kommt dann folgender Fehler:

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0(592): error C2280: 'std::unique_ptr<You,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : Es wurde versucht, auf eine gelöschte Funktion zu verweisen
    with
    [
    _Ty=You
    ]
    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\memory(1486): Siehe Deklaration von 'std::unique_ptr<You,std::default_delete<_Ty>>::unique_ptr'
    with
    [
    _Ty=You
    ]
    Diese Diagnose trat in der vom Compiler generierten Funktion "std::pair<const _Kty,_Ty>::pair(const std::pair<const _Kty,_Ty> &)" auf.
    with
    [
    _Kty=short
    , _Ty=EmployeePtr
    ]

    Mir ist mehr oder weniger klar das die unordered_map ein Problem darstellt, jedoch weis ich nicht genau warum. Wann versuche ich denn den Copy Constructor aufzurufen? Ich habe auch schon

    schiff = std::move(Schiff(1337));
    

    versucht. Geht aber auch nicht.

    danke schon mal für Ideen und Anreize.



  • Du kopierst ein Schiff in ein anderes. Dabei muss die map kopiert werden, was bedeutet, die unique_ptr zu kopieren. Das geht aber nicht ( dir ist hoffentlich klar, warum).



  • Das hatte ich mir schon gedacht, aber geht es denn überhaupt eine gloable variable der Klasse zu erstellen welche nicht sofort initialisiert wird sondern erst später in eine Funktion? Oder muss ich doch wieder auf einen Globalen Pointer zurück greifen?



  • MrSpoocy schrieb:

    Das hatte ich mir schon gedacht, aber geht es denn überhaupt eine gloable variable der Klasse zu erstellen welche nicht sofort initialisiert wird sondern erst später in eine Funktion?

    Natürlich geht das nicht. Deinem Code nach hast du nirgendwo eine globale Variable schiff. Wenn du die Zuweisung auskommentierst, wird sich der Linker entsprechend beschweren.

    Oder muss ich doch wieder auf einen Globalen Pointer zurück greifen?

    Globale Variablen sind doof! Du musst sie also nicht benutzen 😉

    In deinem Beispiel könntest du einen Defaultkonstruktor schreiben und später einfach eine Id zuweisen. Ob das dann besser als ein Pointer ist, musst du selber wissen...


Anmelden zum Antworten