<?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[make_shared Problem&#x2F;Frage]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bin gerade dabei mir die Neuerungen von C++11 anzuschauen und anzuwenden. Allerdings bin ich schon auf ein Problem gestoßen und weiß leider nicht weiter.</p>
<p>Ich lege mir ein neues &quot;_ns2__login&quot; Objekt an. Klappt soweit auch. In dieser Klasse ist nun eine Eigenschaft mit dem Namen &quot;ns2__LoginRequest&quot;.</p>
<pre><code>auto loginRequest = make_shared&lt;_ns2__login&gt;();
     loginRequest-&gt;ns2__LoginRequest = make_shared&lt;_ns2__LoginRequest&gt;();
</code></pre>
<p>Diese versuche ich ebenfalls mit make_shared zu instanziieren. Leider kommt aber die Fehlermeldung:<br />
&quot;Fehler 1 error C2440: '=': 'std::tr1::shared_ptr&lt;_Ty&gt;' kann nicht in 'BasicService::_ns2__LoginRequest *' konvertiert werden&quot;</p>
<p>Ich begreife natürlich den Fehler aber werden solche Objekte nicht mehr mit make_shared erstellt oder wie geht man hier vor? Immerhin bekomme ich ja einen shared_ptr zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/311479/make_shared-problem-frage</link><generator>RSS for Node</generator><lastBuildDate>Mon, 03 Aug 2026 14:16:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/311479.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 06 Dec 2012 14:30:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to make_shared Problem&#x2F;Frage on Thu, 06 Dec 2012 14:30:26 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich bin gerade dabei mir die Neuerungen von C++11 anzuschauen und anzuwenden. Allerdings bin ich schon auf ein Problem gestoßen und weiß leider nicht weiter.</p>
<p>Ich lege mir ein neues &quot;_ns2__login&quot; Objekt an. Klappt soweit auch. In dieser Klasse ist nun eine Eigenschaft mit dem Namen &quot;ns2__LoginRequest&quot;.</p>
<pre><code>auto loginRequest = make_shared&lt;_ns2__login&gt;();
     loginRequest-&gt;ns2__LoginRequest = make_shared&lt;_ns2__LoginRequest&gt;();
</code></pre>
<p>Diese versuche ich ebenfalls mit make_shared zu instanziieren. Leider kommt aber die Fehlermeldung:<br />
&quot;Fehler 1 error C2440: '=': 'std::tr1::shared_ptr&lt;_Ty&gt;' kann nicht in 'BasicService::_ns2__LoginRequest *' konvertiert werden&quot;</p>
<p>Ich begreife natürlich den Fehler aber werden solche Objekte nicht mehr mit make_shared erstellt oder wie geht man hier vor? Immerhin bekomme ich ja einen shared_ptr zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277799</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277799</guid><dc:creator><![CDATA[secondsun]]></dc:creator><pubDate>Thu, 06 Dec 2012 14:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to make_shared Problem&#x2F;Frage on Thu, 06 Dec 2012 14:36:03 GMT]]></title><description><![CDATA[<p>Wem auch immer diese Benennung zu verdanken ist, gehört mal gehörig eine verpasst. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Zu deinem Problem: Du willst einem T* einen shared_ptr&lt;T&gt; zuweisen, das kann ja nicht funktionieren. Und der neue tolle fancy Smartpointer aus C++11 ist eher unique_ptr, nicht shared_ptr. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2277803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277803</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 06 Dec 2012 14:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to make_shared Problem&#x2F;Frage on Thu, 06 Dec 2012 14:51:41 GMT]]></title><description><![CDATA[<p>Ok, bevor man mich für komplett dämlich erklärt....Die Benamung kommt von Daimler und das mit den ganze __ kommt von gsoap;-) Ist also nicht auf meinem Mist gewachsen;-)</p>
<p>Und nun wieder zu dem Problem. Bevor ich mich hier total zum Affen machen... Wie müssten denn dann meine zwei Zeilen Code aussehen;-)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277806</guid><dc:creator><![CDATA[secondsun]]></dc:creator><pubDate>Thu, 06 Dec 2012 14:51:41 GMT</pubDate></item><item><title><![CDATA[Reply to make_shared Problem&#x2F;Frage on Thu, 06 Dec 2012 15:02:53 GMT]]></title><description><![CDATA[<p>Na ja ns2__LoginRequest müsste ein shared_ptr<a href="BasicService::%5C_ns2%5C_%5C_LoginRequest" rel="nofollow">BasicService::\_ns2\_\_LoginRequest</a> sein.</p>
<pre><code>struct A
{
  struct B
  {
  };
  std::shared_ptr&lt;B&gt; b;
};

int main()
{
  auto a = make_shared&lt;A&gt;();
  a-&gt;b = make_shared&lt;B&gt;();
}
</code></pre>
<p>Allerdings fragt sich 1. warum du da überhaupt Pointer brauchst und 2. warum du nicht unique_ptr benutzt. (Achtung, make_unique gibt's nicht, haben sie wohl vergessen (lol, ja, das ist ernst gemeint), sieht dann so aus: std::unique_ptr&lt;T&gt;(new T(...));)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277808</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 06 Dec 2012 15:02:53 GMT</pubDate></item><item><title><![CDATA[Reply to make_shared Problem&#x2F;Frage on Thu, 06 Dec 2012 15:20:18 GMT]]></title><description><![CDATA[<p>secondsun schrieb:</p>
<blockquote>
<pre><code>auto loginRequest = make_shared&lt;_ns2__login&gt;();
     loginRequest-&gt;ns2__LoginRequest = make_shared&lt;_ns2__LoginRequest&gt;();
</code></pre>
<p>Diese versuche ich ebenfalls mit make_shared zu instanziieren. Leider kommt aber die Fehlermeldung:<br />
&quot;Fehler 1 error C2440: '=': 'std::tr1::shared_ptr&lt;_Ty&gt;' kann nicht in 'BasicService::_ns2__LoginRequest *' konvertiert werden&quot;</p>
<p>Ich begreife natürlich den Fehler aber werden solche Objekte nicht mehr mit make_shared erstellt oder wie geht man hier vor?<br />
Immerhin bekomme ich ja einen shared_ptr zurück.</p>
</blockquote>
<p>Wie geht man vor? Man überlegt sich vorher ein Design und versucht es dann umzusetzen. Es hat aber keiner so richtig einen Überblick über das, was du machen willst.</p>
<p>Es sieht nur auf den ersten Blick so aus, als ob du shared_ptr missbrauchen würdest. Ich habe den Eindruck, als ob dir das Konzept der Besitzverhältnisse in C++ nicht ganz vertraut ist und dass du shared_ptr einfach nur als &quot;poor man's garbage collection&quot; einsetzen willst. Das &quot;shared&quot; in shared_ptr bezieht sich nämlich auf genau das. Mehrere shared_ptr-Instanzen &quot;teilen sich den Besitz&quot; eines anderen dynamisch allozierten Objekts. Du solltest wirklich anfangen, in solchen Besitzverhältnissen zu denken. Mit &quot;Besitz&quot; meint man u.a. die Verantwortung zur Verwaltung und Freigabe dessen, was einer oder mehrere zusammen besitzen. Werden diese Besitzverhältnisse beim Design berücksichtigt, wird auch klar, wann du wo welche Art von Zeiger (wenn überhaupt) verwenden solltest.</p>
<pre><code class="language-cpp">T*            --&gt;  Ein roher Zeiger besitzt nichts.
                   Er kann für &quot;kennt&quot;-Beziehungen verwendet werden.

unique_ptr&lt;T&gt; --&gt;  Ein unique_ptr ist alleiniger Besitzer einer Resource
                   und gibt sie wieder frei, wenn der unique_ptr zerstört wird.
                   Das ist praktisch für &quot;besteht-aus&quot;-Beziehungen, bei denen
                   du polymorphes Verhalten haben willst oder bei denen das,
                   worauf er zeigt, optional ist oder verzögert erstellt wird.

shared_ptr&lt;T&gt; --&gt;  Ein shared_ptr kann sich den Besitz mit anderen
                   shared_ptrs teilen. Es gibt sicherlich Situationen, wo
                   so etwas sinnvoll ist. Aber typischerweise kann man
                   einen einzigen &quot;Besitzer&quot; identifizieren und einfach
                   unique_ptr nehmen
</code></pre>
<p>Und oft macht es auch viel mehr Sinn, gar keinen Zeiger zu verwenden. Du kannst Objekte ja auch direkt als Subobjekte in andere einbetten oder im automatischen Speicher anlegen. Überleg dir also genau, ob du ein make_shared oder new überhaupt brauchst. Für delete und delete[] gibt es in modernem C++ Code aber wirklich so gut wie keinen Platz mehr. Dafür gibt's die Container aus der Standardbibliothek und eben diese &quot;Schlau-Zeiger&quot;.</p>
<p>Übrigens gehören Bezeichner mit &quot;Doppelunterstrichen&quot; zu denen, die reserviert sind. Du darfst sie also nicht verwenden. Gleiches gilt für Bezeichner, die mit einem Unterstrich anfangen und dann mit einem Großbuchstaben weiter gehen, wie z.B. &quot;_Ty&quot;. Die Microsoftentwickler haben den Template-Parameter von shared_ptr nicht &quot;_Ty&quot; genannt, weil sie ihn schön finden, sondern weil der C++ Standard den &quot;Normalos&quot; verbietet, solche Namen zu verwenden; denn sonst könnten sie ja einfach</p>
<pre><code class="language-cpp">#define _Ty &quot;fucked up&quot;
</code></pre>
<p>vor die Includes packen und nix geht mehr. Namen mit Doppelunterstrichen gehören auch dazu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2277816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2277816</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 06 Dec 2012 15:20:18 GMT</pubDate></item></channel></rss>