<?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[Pointer&#x2F;Referenzen kleine Frage]]></title><description><![CDATA[<p>Ich möchte den String, der dem Konstruktor der Klasse <code>Beispiel</code> übergeben wird nicht kopieren, sondern weiterhin auf den std::string der auch im &quot;Hauptprogramm&quot; intialisiert wurde zugreifen.</p>
<pre><code>class Beispiel {
public:
  Beispiel(std::string &amp;str) { mStr = &amp;str; }
  void tueWasMitString() { *mStr += &quot;AAA&quot;; }

private:
  std::string *mStr;
};
</code></pre>
<pre><code>int main() {

  std::string test = &quot;BBB&quot;;
  Beispiel b(test);
  b.tueWasMitString();

  std::cout &lt;&lt; test; // soll &quot;BBBAAA&quot;
}
</code></pre>
<p>Hier bekomme ich aber die Meldung vom Compiler in Zeile 4 &quot;Der Ausdruck muss einen Klassentyp aufweisen&quot;, wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/312596/pointer-referenzen-kleine-frage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 19:36:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/312596.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Jan 2013 20:48:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Tue, 08 Jan 2013 20:48:00 GMT]]></title><description><![CDATA[<p>Ich möchte den String, der dem Konstruktor der Klasse <code>Beispiel</code> übergeben wird nicht kopieren, sondern weiterhin auf den std::string der auch im &quot;Hauptprogramm&quot; intialisiert wurde zugreifen.</p>
<pre><code>class Beispiel {
public:
  Beispiel(std::string &amp;str) { mStr = &amp;str; }
  void tueWasMitString() { *mStr += &quot;AAA&quot;; }

private:
  std::string *mStr;
};
</code></pre>
<pre><code>int main() {

  std::string test = &quot;BBB&quot;;
  Beispiel b(test);
  b.tueWasMitString();

  std::cout &lt;&lt; test; // soll &quot;BBBAAA&quot;
}
</code></pre>
<p>Hier bekomme ich aber die Meldung vom Compiler in Zeile 4 &quot;Der Ausdruck muss einen Klassentyp aufweisen&quot;, wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287754</guid><dc:creator><![CDATA[pointerHILFE]]></dc:creator><pubDate>Tue, 08 Jan 2013 20:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Tue, 08 Jan 2013 20:53:17 GMT]]></title><description><![CDATA[<p><a href="http://ideone.com/A6OJyB" rel="nofollow">http://ideone.com/A6OJyB</a> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287756</guid><dc:creator><![CDATA[ideonaut]]></dc:creator><pubDate>Tue, 08 Jan 2013 20:53:17 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Tue, 08 Jan 2013 20:54:08 GMT]]></title><description><![CDATA[<p>Wahrscheinlich hast du ein include vergessen (wenn du mehrere Files hast, ansonsten kann man den Fehler hier nicht sehen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287757</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 08 Jan 2013 20:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Wed, 09 Jan 2013 07:03:28 GMT]]></title><description><![CDATA[<p>Wobei das, was du vorhast auch nicht so ganz super ist.<br />
Die hast eine Klasse, die von der Lebensdauer einer anderen Klasse direkt abhängt. Das heisst es könnte schnell mal passieren, dass<br />
1.- deine externe string Variable gelöscht wird =&gt; deine Klasse auf einmal auf den String zugreifen will, das geht dann aber nicht mehr (logischerweise)<br />
2.- deine Klasseninternas können von aussen geändert werden -&gt; das widerspricht dem Paradigma der Kapselung</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287818</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 09 Jan 2013 07:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Wed, 09 Jan 2013 13:18:08 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a> Es gibt nur leider kein ordentliches Pattern für das Problem, jedenfalls ist mir keins bekannt. Wobei Problem 2 eher nebensächlich ist, das erste zu lösen (ohne shared_ptr!) wäre schon toll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287923</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 09 Jan 2013 13:18:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Wed, 09 Jan 2013 13:31:56 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>2.- deine Klasseninternas können von aussen geändert werden -&gt; das widerspricht dem Paradigma der Kapselung</p>
</blockquote>
<p>Das heisst, jede Klasse, die Zeiger oder Referenzen auf andere Objekte hält, widerspricht dem Paradigma der Kapselung?</p>
<p>Nein. Der String gehört nicht zum Zustand des Objekts, sondern nur der Verweis darauf.</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a> Es gibt nur leider kein ordentliches Pattern für das Problem, jedenfalls ist mir keins bekannt.</p>
</blockquote>
<p>Man kann es natürlich so einrichten, dass bei der Zerstörung des Strings das Objekt benachrichtigt wird (Observer). Nur ist das übertrieben, wenn man die Lebenszeit des Strings garantieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287924</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 09 Jan 2013 13:31:56 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Wed, 09 Jan 2013 13:36:20 GMT]]></title><description><![CDATA[<p>Ja, brauchen tut mans schon manchmal. Aber trotzdem würde ich hier höllisch aufpassen, vor allem wenn man nicht alleine an dem Code werkelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287927</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 09 Jan 2013 13:36:20 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Wed, 09 Jan 2013 13:44:38 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Man kann es natürlich so einrichten, dass bei der Zerstörung des Strings das Objekt benachrichtigt wird (Observer). Nur ist das übertrieben, wenn man die Lebenszeit des Strings garantieren kann.</p>
</blockquote>
<p>Genau das ist ja mein Problem damit. Eine art Observer-Wrapper oder auch shared_ptr könnte das leisten, aber es ist eben nicht <strong>die</strong> Lösung. Nicht nur dass es runtime Overhead mitbringt, es packt das Problem auch nicht da wo es sitzt: Die Variable soll einfach garantiert länger leben als die Referenz. Richtig toll wäre z.B. gleich einen Compilerfehler zu generieren, aber ich bezweifle dass das möglich ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a> Leider braucht man das ziemlich oft.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2287931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287931</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Wed, 09 Jan 2013 13:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Wed, 09 Jan 2013 13:50:53 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Compilerfehler</p>
</blockquote>
<p>Wie soll das im Allgemeinen gehen?</p>
<pre><code class="language-cpp">std::unique_ptr&lt;std::string&gt; s(new std::string(&quot;test&quot;));
Beispiel b(test);

if (rand()%2)
  s.reset();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2287938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2287938</guid><dc:creator><![CDATA[kugelglas]]></dc:creator><pubDate>Wed, 09 Jan 2013 13:50:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 09:25:43 GMT]]></title><description><![CDATA[<blockquote>
<p>1.- deine externe string Variable gelöscht wird =&gt; deine Klasse auf einmal auf den String zugreifen will, das geht dann aber nicht mehr (logischerweise)</p>
</blockquote>
<p>Wie soll das möglich sein? Einen std::string kannst du nicht einfach zerstören, er müsste aus dem jeweiligen Scope raus. Das erzeugte Objekt würde dann ebenfalls zerstört, da es nach dem std::string erzeugt wurde und somit sich mind. im gleichen, oder &quot;geringerem&quot; Scope befinden muss.</p>
<p>Von daher sehe ich da überhaupt kein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288185</guid><dc:creator><![CDATA[hthd]]></dc:creator><pubDate>Thu, 10 Jan 2013 09:25:43 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 09:34:26 GMT]]></title><description><![CDATA[<p>hthd schrieb:</p>
<blockquote>
<p>Wie soll das möglich sein? Einen std::string kannst du nicht einfach zerstören, er müsste aus dem jeweiligen Scope raus. Das erzeugte Objekt würde dann ebenfalls zerstört, da es nach dem std::string erzeugt wurde und somit sich mind. im gleichen, oder &quot;geringerem&quot; Scope befinden muss.</p>
</blockquote>
<p>simpel:</p>
<pre><code class="language-cpp">std::String* pointerString = new std::string(&quot;Hallo&quot;);
Beispiel errorBeispiel(*pointerString);
delete pointerString;
errorBeispiel.tueWasMitString();
</code></pre>
<p>ein etwas realistischeres Beispiel:</p>
<pre><code class="language-cpp">struct DummyStruct
{ 
  DummyStruct : test(&quot;Blabla&quot;) {}
  std::string&amp; GetTestString() {return test;}
  std::string test; 
}

void doSomething()
{
  DummyStruct* dummy = new DummyStruct; 
  Beispiel errorBeispiel(dummy-&gt;GetTestString());
  delete dummy;
  errorBeispiel.tueWasMitString();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2288189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288189</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 10 Jan 2013 09:34:26 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 09:37:42 GMT]]></title><description><![CDATA[<p>hthd schrieb:</p>
<blockquote>
<blockquote>
<p>1.- deine externe string Variable gelöscht wird =&gt; deine Klasse auf einmal auf den String zugreifen will, das geht dann aber nicht mehr (logischerweise)</p>
</blockquote>
<p>Wie soll das möglich sein? Einen std::string kannst du nicht einfach zerstören, er müsste aus dem jeweiligen Scope raus. Das erzeugte Objekt würde dann ebenfalls zerstört, da es nach dem std::string erzeugt wurde und somit sich mind. im gleichen, oder &quot;geringerem&quot; Scope befinden muss.</p>
<p>Von daher sehe ich da überhaupt kein Problem.</p>
</blockquote>
<p>Geht, wenn string oder Beispiel nicht nur auf dem Stack liegen, sondern zum Beispiel per new angelegt wurden oder in sonst einem komischen Speicher liegen.</p>
<pre><code>void f(){
   string abc(&quot;abc&quot;);
   throw Beispiel(abc);//komischer Speicher, wo Excpeptions leben
}
void g(){
   string abc(&quot;abc&quot;);
   static Beispiel bsp(abc);//komischer Speicher, wo statische Variablen leben
   bsp.tueWasMitString();
   cout&lt;&lt;abc;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2288191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288191</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 10 Jan 2013 09:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 09:44:40 GMT]]></title><description><![CDATA[<p>Hey Jungs,</p>
<p>ist nicht genau für solche Fälle der shared_ptr da? Ok, da ist Overhead bei, aber da ist auch garantiert, dass ein Objekt solange lebt bis es nicht mehr gebraucht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288195</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 10 Jan 2013 09:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 09:46:48 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>ist nicht genau für solche Fälle der shared_ptr da? Ok, da ist Overhead bei, aber da ist auch garantiert, dass ein Objekt solange lebt bis es nicht mehr gebraucht wird.</p>
</blockquote>
<p>stimmt, in einem solchen Fall wäre ein shared_ptr sicherlich angebracht. WUrde von cooky ja auch schon erwähnt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288196</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 10 Jan 2013 09:46:48 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 09:54:08 GMT]]></title><description><![CDATA[<p>Jaja, das hab ich auf dem Schirm. Aber er meinte ja, was von wegen ohne shared_ptr lösen. Die Frage ist wieso?</p>
<p>Ok, das ganze in die Compiletime zu verlegen wäre schon cool, aber weniger möglich, denke ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288197</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 10 Jan 2013 09:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 11:57:21 GMT]]></title><description><![CDATA[<p>Die Gefahr mit den komischen Speicherbereichen ist gar nicht so riesig.<br />
Hat es Sinn, das ohne shared_pointers zu machen, dann wird es auch so sein, daß man sich kaum eine mißbräuchliche Verwendung einfallen läßt. Also wenn der string vielleicht sowas wie ein socket provider ist, den man bestimmt nicht löscht, solange sockets von ihm leben könnten. Oder irgendwelche Thread-Multiplexer oder das Welt-Objekt im Game.<br />
~~Nicht zu vergessen, daß string vermutlich eh copy-on-write drinnen hat, da haben wie die shard_pointer-Kosten ja schon, vielleicht die ausgabe auch übers Beispiel leiten und Kopie des Strings merken.<br />
~~<br />
Und kurzlebige Proxies natürlich.</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; out,Beispiel const&amp; bsp){
   return out&lt;&lt;time(0)&lt;&lt;' '&lt;&lt;bsp.str;
}
...
logfile&lt;&lt;Beispiel(msg)&lt;&lt;endl;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2288202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288202</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:57:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 11:53:30 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Nicht zu vergessen, daß string vermutlich eh copy-on-write drinnen hat, da haben wie die shard_pointer-Kosten ja schon, vielleicht die ausgabe auch übers Beispiel leiten und Kopie des Strings merken.</p>
</blockquote>
<p>Ist mit C++11 afaik nicht mehr erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288233</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Thu, 10 Jan 2013 11:53:30 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 12:10:41 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>volkard schrieb:</p>
<blockquote>
<p>Nicht zu vergessen, daß string vermutlich eh copy-on-write drinnen hat, da haben wie die shard_pointer-Kosten ja schon, vielleicht die ausgabe auch übers Beispiel leiten und Kopie des Strings merken.</p>
</blockquote>
<p>Ist mit C++11 afaik nicht mehr erlaubt.</p>
</blockquote>
<p>das Forum lernt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
<a href="http://www.c-plusplus.net/forum/p2281175#2281175" rel="nofollow">http://www.c-plusplus.net/forum/p2281175#2281175</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288244</guid><dc:creator><![CDATA[refcounted]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:10:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 12:33:28 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Jaja, das hab ich auf dem Schirm. Aber er meinte ja, was von wegen ohne shared_ptr lösen. Die Frage ist wieso?</p>
</blockquote>
<p>Hab ich doch auch schon geschrieben. Technisch gesehen ist es sinnloser Overhead. Sprachlich gesehen ist es einfach das falsche Konzept: Es existiert keine shared ownership. Der String hat halt einfach in jedem Fall länger zu leben, wenn das nicht der Fall ist, ist das ein Programmierfehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288258</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 12:38:13 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Der String hat halt einfach in jedem Fall länger zu leben, wenn das nicht der Fall ist, ist das ein Programmierfehler.</p>
</blockquote>
<p>Und wenn nach einem new kein passendes delete folgt, ist das auch ein Programmierfehler. Das ist aber kein Grund, das Klassendesign nicht so vorzunehmen, dass solche Programmierfehler möglichst ausgeschlossen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288260</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 12:49:45 GMT]]></title><description><![CDATA[<p>Lies noch mal den ganzen Thread. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288264</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:49:45 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 12:55:00 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Der String hat halt einfach in jedem Fall länger zu leben, wenn das nicht der Fall ist, ist das ein Programmierfehler.</p>
</blockquote>
<p>Hier wäre eine Mischung von <code>string_reference</code> und <code>initializer_list</code> angebracht:</p>
<pre><code class="language-cpp">template &lt;typename T&gt; granted_lifetime; // Klasse in der Standardbibliothek mit Compilermagie
Beispiel::Beispiel(granted_lifetime&lt;std::string&gt;);

// ...
string abc(&quot;abc&quot;);
Beispiel bsp1(abc); // abc und bsp sind im automatischen Speicher -&gt; abc konvertiert implizit zu granted_lifetime
Beispiel *bsp2 = new Beispiel(abc); // bsp liegt liegt im dynamischen Speicher -&gt; Compilerfehler

shared_ptr&lt;string&gt; def = make_shared&lt;string&gt;(&quot;abc&quot;);
Beispiel bsp3(def); // shared_ptr konvertiert *immer* zu granted_lifetime
Beispiel *bsp4 = new Beispiel(abc); // dito

unique_ptr&lt;string&gt; ghi = new string(&quot;abc&quot;);
Beispiel bsp5(ghi.get()); // Pointer sind unsicher =&gt; Compilerfehler
Beispiel bsp6(grant_lifetime(ghi.get())); // Garantiere explizit
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2288268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288268</guid><dc:creator><![CDATA[kugelglas]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 12:56:51 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Lies noch mal den ganzen Thread. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>ich habe den Thread verfolgt.</p>
<p>Wenn man das so programmiert, dann muss der string mindestens so lange Leben, wie das Objekt, das stimmt. Und weil diese Einschränkung leicht umgangen werden kann, sollte überdenken, ob das Design so wirklich sinnvoll ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288269</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Thu, 10 Jan 2013 12:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 13:04:05 GMT]]></title><description><![CDATA[<p>@kugelglas Die granted_lifetime Klasse ist nur leider unmöglich zu schreiben denke ich, auch mit Compilermagie.</p>
<p>Eine Möglichkeit wäre noch eine Klasse zu schreiben in die eben nicht implizit konvertiert wird. Die wäre dann einfach nur Deko und würde gar nichts machen, aber man ist gezwungen von außen kenntlich zu machen, was in der Klasse passiert.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/27454">@daddy_felix</a> Nur weil etwas funktioniert, muss es nicht gut sein. Und wenn du den ganzen Thread gelesen hast, war dein Kommentar sinnlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288272</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288272</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 10 Jan 2013 13:04:05 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 13:10:01 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>@kugelglas Die granted_lifetime Klasse ist nur leider unmöglich zu schreiben denke ich, auch mit Compilermagie.</p>
</blockquote>
<p>Die wichtigsten Spezialfälle könnte man IMHO schon abdecken. Und in die anderen Fällen (welche dann auch für den Code-Leser nicht offensichtlich sind) muss man halt explizit <code>grant_lifetime()</code> aufrufen.</p>
<p>Und selbst jetzt mit C++11, wenn die Klasse nur Deko wäre, fände ich sie nicht einmal so schlecht. (Die Frage ist nur, wie man sie in die Klasse bekommt, sie darf halt weder Copyable noch Movable sein; wahrscheinlich mit einem weiteren Aufruf von grant_lifetime: s(grant_lifetime(granted)).)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288274</guid><dc:creator><![CDATA[kugelglas]]></dc:creator><pubDate>Thu, 10 Jan 2013 13:10:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer&#x2F;Referenzen kleine Frage on Thu, 10 Jan 2013 13:15:48 GMT]]></title><description><![CDATA[<p>Warum sollte sie nicht copy/moveable sein dürfen? Letztlich hofft man da ja auf die Intelligenz des Users und versucht nur Flüchtigkeitsfehler zu vermeiden, da muss man es an der Stelle nicht unnötig kompliziert machen denke ich. Oder übersehe ich da etwas, was leicht schief gehen könnte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2288277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2288277</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 10 Jan 2013 13:15:48 GMT</pubDate></item></channel></rss>