<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[std::unique_ptr als Klassenmember einer globalen (extern) Klasse?]]></title><description><![CDATA[<p>Hi,</p>
<p>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:</p>
<pre><code>// schiff.h
	extern Schiff schiff;

	// schiff.cpp
	class Schiff
	{
	private:
		typedef std::unique_ptr&lt;You&gt; EmployeePtr;
		std::unordered_map&lt;short, EmployeePtr&gt; employee;
		short id;
	public:
		Schiff(short id) : id(id) {};
	}
</code></pre>
<p>Später wird in einer ganz anderen Datei die schiff variable &quot;befüllt&quot;:</p>
<pre><code>// misc.cpp
void irgendEineFunktion()
{
	schiff = Schiff(1337);
}
</code></pre>
<p>Beim compilieren kommt dann folgender Fehler:</p>
<blockquote>
<p>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0(592): error C2280: 'std::unique_ptr&lt;You,std::default_delete&lt;_Ty&gt;&gt;::unique_ptr(const std::unique_ptr&lt;_Ty,std::default_delete&lt;_Ty&gt;&gt; &amp;)' : Es wurde versucht, auf eine gelöschte Funktion zu verweisen<br />
with<br />
[<br />
_Ty=You<br />
]<br />
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\memory(1486): Siehe Deklaration von 'std::unique_ptr&lt;You,std::default_delete&lt;_Ty&gt;&gt;::unique_ptr'<br />
with<br />
[<br />
_Ty=You<br />
]<br />
Diese Diagnose trat in der vom Compiler generierten Funktion &quot;std::pair&lt;const _Kty,_Ty&gt;::pair(const std::pair&lt;const _Kty,_Ty&gt; &amp;)&quot; auf.<br />
with<br />
[<br />
_Kty=short<br />
, _Ty=EmployeePtr<br />
]</p>
</blockquote>
<p>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</p>
<pre><code>schiff = std::move(Schiff(1337));
</code></pre>
<p>versucht. Geht aber auch nicht.</p>
<p>danke schon mal für Ideen und Anreize.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/334817/std-unique_ptr-als-klassenmember-einer-globalen-extern-klasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Apr 2026 03:56:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/334817.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 13 Oct 2015 10:26:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::unique_ptr als Klassenmember einer globalen (extern) Klasse? on Tue, 13 Oct 2015 10:26:05 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>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:</p>
<pre><code>// schiff.h
	extern Schiff schiff;

	// schiff.cpp
	class Schiff
	{
	private:
		typedef std::unique_ptr&lt;You&gt; EmployeePtr;
		std::unordered_map&lt;short, EmployeePtr&gt; employee;
		short id;
	public:
		Schiff(short id) : id(id) {};
	}
</code></pre>
<p>Später wird in einer ganz anderen Datei die schiff variable &quot;befüllt&quot;:</p>
<pre><code>// misc.cpp
void irgendEineFunktion()
{
	schiff = Schiff(1337);
}
</code></pre>
<p>Beim compilieren kommt dann folgender Fehler:</p>
<blockquote>
<p>C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\xmemory0(592): error C2280: 'std::unique_ptr&lt;You,std::default_delete&lt;_Ty&gt;&gt;::unique_ptr(const std::unique_ptr&lt;_Ty,std::default_delete&lt;_Ty&gt;&gt; &amp;)' : Es wurde versucht, auf eine gelöschte Funktion zu verweisen<br />
with<br />
[<br />
_Ty=You<br />
]<br />
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\memory(1486): Siehe Deklaration von 'std::unique_ptr&lt;You,std::default_delete&lt;_Ty&gt;&gt;::unique_ptr'<br />
with<br />
[<br />
_Ty=You<br />
]<br />
Diese Diagnose trat in der vom Compiler generierten Funktion &quot;std::pair&lt;const _Kty,_Ty&gt;::pair(const std::pair&lt;const _Kty,_Ty&gt; &amp;)&quot; auf.<br />
with<br />
[<br />
_Kty=short<br />
, _Ty=EmployeePtr<br />
]</p>
</blockquote>
<p>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</p>
<pre><code>schiff = std::move(Schiff(1337));
</code></pre>
<p>versucht. Geht aber auch nicht.</p>
<p>danke schon mal für Ideen und Anreize.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2470847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2470847</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Tue, 13 Oct 2015 10:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr als Klassenmember einer globalen (extern) Klasse? on Tue, 13 Oct 2015 10:51:42 GMT]]></title><description><![CDATA[<p>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).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2470850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2470850</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 13 Oct 2015 10:51:42 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr als Klassenmember einer globalen (extern) Klasse? on Tue, 13 Oct 2015 11:03:55 GMT]]></title><description><![CDATA[<p>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?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2470851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2470851</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Tue, 13 Oct 2015 11:03:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr als Klassenmember einer globalen (extern) Klasse? on Tue, 13 Oct 2015 11:23:42 GMT]]></title><description><![CDATA[<p>MrSpoocy schrieb:</p>
<blockquote>
<p>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?</p>
</blockquote>
<p>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.</p>
<blockquote>
<p>Oder muss ich doch wieder auf einen Globalen Pointer zurück greifen?</p>
</blockquote>
<p>Globale Variablen sind doof! Du musst sie also nicht benutzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>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...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2470853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2470853</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 13 Oct 2015 11:23:42 GMT</pubDate></item></channel></rss>