<?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[Konvertierung zu Pointer auf Konstante]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende Klasse partition_tree (nur das wesentliche):</p>
<pre><code class="language-cpp">class partition_tree
{
private:
	vector&lt;partition_node*&gt; part_nodes;
public:
	const vector&lt;partition_node*&gt; get_part_nodes() { return part_nodes; }
};
</code></pre>
<p>Dabei ist partition_node irgendeine Klasse.</p>
<p>Nun hätte ich gerne, dass get_part_nodes() einen Vektor aus Pointern auf Konstanten zurückgibt (Schließlich ist diese Methode öffentlich und man soll damit keine Veränderungen an part_nodes vornehmen dürfen). Die Veränderung</p>
<pre><code class="language-cpp">const vector&lt;const partition_node*&gt; get_part_nodes() { return part_nodes; }
</code></pre>
<p>führt allerdings zur Fehlermeldung</p>
<blockquote>
<p>conversion from ‘std::vector&lt;partition_node*, std::allocator&lt;partition_node*&gt; &gt;’ to non-scalar type ‘std::vector&lt;const partition_node*, std::allocator&lt;const partition_node*&gt; &gt;’ requested</p>
</blockquote>
<p>Wie behebt man das am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206046/konvertierung-zu-pointer-auf-konstante</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 06:57:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206046.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 20 Feb 2008 18:01:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Wed, 20 Feb 2008 18:01:02 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe folgende Klasse partition_tree (nur das wesentliche):</p>
<pre><code class="language-cpp">class partition_tree
{
private:
	vector&lt;partition_node*&gt; part_nodes;
public:
	const vector&lt;partition_node*&gt; get_part_nodes() { return part_nodes; }
};
</code></pre>
<p>Dabei ist partition_node irgendeine Klasse.</p>
<p>Nun hätte ich gerne, dass get_part_nodes() einen Vektor aus Pointern auf Konstanten zurückgibt (Schließlich ist diese Methode öffentlich und man soll damit keine Veränderungen an part_nodes vornehmen dürfen). Die Veränderung</p>
<pre><code class="language-cpp">const vector&lt;const partition_node*&gt; get_part_nodes() { return part_nodes; }
</code></pre>
<p>führt allerdings zur Fehlermeldung</p>
<blockquote>
<p>conversion from ‘std::vector&lt;partition_node*, std::allocator&lt;partition_node*&gt; &gt;’ to non-scalar type ‘std::vector&lt;const partition_node*, std::allocator&lt;const partition_node*&gt; &gt;’ requested</p>
</blockquote>
<p>Wie behebt man das am besten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459658</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Wed, 20 Feb 2008 18:01:02 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Wed, 20 Feb 2008 18:49:36 GMT]]></title><description><![CDATA[<p>Indem du einen neuen Vektor mit konstanten Pointern erstellst und den zurückgibst?</p>
<pre><code class="language-cpp">const vector&lt;const partition_node*&gt; get_part_nodes() 
{ 
  return vector&lt;const partition_node*&gt;(part_nodes.begin(), part_nodes.end()); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1459674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459674</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 20 Feb 2008 18:49:36 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Wed, 20 Feb 2008 18:30:27 GMT]]></title><description><![CDATA[<p>hätte ich jetzt auch gesagt:</p>
<pre><code class="language-cpp">const std::vector&lt;const partition_node*&gt; get_part_nodes() 
{ 
   std::vector&lt;const partition*&gt; tmp;
   std::copy(nodes.begin(),nodes.end(), back_inserter(tmp));
   return tmp;
}
</code></pre>
<p>aber Braunsteins ist etwas schlanker...</p>
<p>ach ja und da dann eh ein unveränderliches Objekt zugewiesen wird, kannst du die Methode gleich auch const deklarieren:</p>
<pre><code class="language-cpp">const std::vector&lt;const partition_node*&gt; get_part_nodes() const
{...}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1459678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459678</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 20 Feb 2008 18:30:27 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Wed, 20 Feb 2008 18:32:27 GMT]]></title><description><![CDATA[<p>Also man kann mit dem zurückgegebenen nichts in der Klasse verändern.<br />
Ist ja kein Zeiger, oder Referenz, sondern wird ja kopiert.</p>
<p>Wenn dann mach das Objekt const, dass du nacher brauchst.</p>
<pre><code class="language-cpp">partition_tree a;

const vector&lt;const partition_node*&gt; obj = a.get_part_nodes ();
</code></pre>
<p>Da kannst du auch nichts mehr dran ändenr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459683</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 20 Feb 2008 18:32:27 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Wed, 20 Feb 2008 18:38:15 GMT]]></title><description><![CDATA[<p>also wenn ich das richtig sehe, so möchte ingobulla sich eben ne liste mit allen knoten zurück geben lassen und sicher gehen, dass die knoten-objekte NICHT vereändert werden können.</p>
<p>Da macht</p>
<pre><code class="language-cpp">const std::vector&lt;const partition_node*&gt; get_part_nodes() const 
{...}
</code></pre>
<p>das durchaus Sinn udn ist sogar die einzige Alternative!</p>
<p>Und die Rückgabe in ein konstantes Objekt reicht da nicht aus...</p>
<p>Nimm Braunsteinslösung und alles wird gut. Eine atumatische Konvertierung macht der compiler eben nicht!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1459688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1459688</guid><dc:creator><![CDATA[muffmolch]]></dc:creator><pubDate>Wed, 20 Feb 2008 18:38:15 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 10:57:17 GMT]]></title><description><![CDATA[<p>Danke, das hat mir auf jeden Fall weitergeholfen. Hier noch eine darauf aufbauende Frage:</p>
<p>Angenommen ich möchte nicht eine Kopie von part_nodes, sondern einen Zeiger auf part_nodes zurückgeben, der dem Benutzer von get_part_nodes() erlaubt, part_nodes zu lesen, aber nicht zu verändern. Wie macht man das am besten?</p>
<p>Die folgende Lösung wird ja wohl nicht gehen, da ich eine Referenz auf ein lokales Objekt zurückgebe, dessen Destruktor nach verlassen des Gültigkeitsbereichs von get_part_nodes() aufgerufen wird.</p>
<pre><code class="language-cpp">class partition_tree
{
private:
    vector&lt;partition_node*&gt; part_nodes;
public:
    const vector&lt;const partition_node*&gt;* get_part_nodes() 
    { 
        return &amp;(vector&lt;const partition_node*&gt;(part_nodes.begin(), part_nodes.end())); 
    }
};
</code></pre>
<p>Wenn ich stattdessen new benutze, wäre der Benutzer von get_part_nodes() doch gezwungen die Rückgabe von get_part_nodes() mittels delete zu löschen?</p>
<p>Und allgemeiner gefragt: Wenn man eine Variable wie part_nodes in einer Klasse hat und diese Variable mit einer Methode get_part_nodes() zum Nur-Lesen herausgeben will, wie macht man das am besten? Insbesondere: Geht das auch irgendwie ohne Kopieraktionen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460076</guid><dc:creator><![CDATA[ingobulla]]></dc:creator><pubDate>Thu, 21 Feb 2008 10:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 11:58:00 GMT]]></title><description><![CDATA[<p>Warum muss es denn unbedingt ein vector sein? Wenn man nur Lesen will, dürfte eine einfache Sequenz ausreichen, und man spart so unnötiges Kopieren. Wenn der Aufrufer unbedingt einen vector haben will, kann er den ja immer noch initialisieren.</p>
<pre><code class="language-cpp">class partition_tree
{
private:
    vector&lt;partition_node*&gt; part_nodes;
public:
    std::pair&lt;vector&lt;partition_node*&gt;::const_iterator, vector&lt;partition_node*&gt;::const_iterator&gt; get_part_nodes() const { return make_pair(part_nodes.begin(),part_nodes.end()); }
};
</code></pre>
<p>nebenbei: vergiss const-Rückgaben. Die sind fast immer großer Blödsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460115</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 21 Feb 2008 11:58:00 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 13:55:33 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>nebenbei: vergiss const-Rückgaben. Die sind fast immer großer Blödsinn.</p>
</blockquote>
<p>Was würden denn dagegen sprechen:</p>
<pre><code class="language-cpp">class partition_tree
{
private:
    vector&lt;partition_node*&gt; part_nodes;
public:
    const vector&lt;const partition_node*&gt;&amp; get_part_nodes() const
    {
        return part_nodes;
    }
};
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460228</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 21 Feb 2008 13:55:33 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 13:59:40 GMT]]></title><description><![CDATA[<p>nichts, aber der OP macht eine rückgabe per value, hat also eine konstante kopie.</p>
<p>und sowas verwendet man idR auch nur bei überladung gewisser operatoren - selbst da ist die verwendung umstritten und dient nur dem zweck, user-defined typen den builtins ein bisschen ähnlicher zu machen. (und ich weiß zufällig, das camper auch auf diesen einsatz von const-rückgaben gar nicht steht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460234</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 21 Feb 2008 13:59:40 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 14:00:20 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>nebenbei: vergiss const-Rückgaben. Die sind fast immer großer Blödsinn.</p>
</blockquote>
<p>Was würden denn dagegen sprechen:</p>
<pre><code class="language-cpp">class partition_tree
{
private:
    vector&lt;partition_node*&gt; part_nodes;
public:
    const vector&lt;const partition_node*&gt;&amp; get_part_nodes() const
    {
        return part_nodes;
    }
};
</code></pre>
<p>?</p>
</blockquote>
<p>Dass es nicht möglich ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460235</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460235</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 21 Feb 2008 14:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 14:50:44 GMT]]></title><description><![CDATA[<p>queer_boy schrieb:</p>
<blockquote>
<p>nichts, aber der OP macht eine rückgabe per value, ...</p>
</blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<pre><code class="language-cpp">const vector&lt;const partition_node*&gt;&amp; // &lt;- Hier steht allerdings ein &amp;
</code></pre>
</blockquote>
<p>Aber wenn camper schreibt, dass das verboten sei, glaube ich ihm das....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460263</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 21 Feb 2008 14:50:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 14:55:44 GMT]]></title><description><![CDATA[<p>er bezieht sich in seinem letzten posting ja nur darauf, dass <code>vector&lt;X*&gt;</code> und <code>vector&lt;const X*&gt;</code> zwei verschiedene typen sind...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460270</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Thu, 21 Feb 2008 14:55:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 15:30:36 GMT]]></title><description><![CDATA[<p>ah sorry, es ging ja eigentlich darum, dass auch die Zeiger konstant sein sollen, ein const_iterator genügt da nat. noch nicht:</p>
<pre><code class="language-cpp">class partition_tree
{
private:
    vector&lt;partition_node*&gt; part_nodes;
public:
    std::pair&lt;const partition_node* const*, const partition_node* const*&gt; get_part_nodes() const { return make_pair(&amp;*part_nodes.begin(),&amp;*part_nodes.end()); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1460299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460299</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 21 Feb 2008 15:30:36 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 15:48:59 GMT]]></title><description><![CDATA[<p>Ich denke hier wäre vielleicht ein typedef angebracht. <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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460323</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 21 Feb 2008 15:48:59 GMT</pubDate></item><item><title><![CDATA[Reply to Konvertierung zu Pointer auf Konstante on Thu, 21 Feb 2008 15:50:37 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Was würden denn dagegen sprechen:</p>
<pre><code class="language-cpp">class partition_tree
{
private:
    vector&lt;partition_node*&gt; part_nodes;
public:
    const vector&lt;const partition_node*&gt;&amp; get_part_nodes() const
    {
        return part_nodes;
    }
};
</code></pre>
<p>?</p>
</blockquote>
<p>Dass es nicht möglich ist?</p>
</blockquote>
<p>Ich meinte eigentlich ohne das &quot;const&quot; im Template-Parameter... Aber ok, dann wär's Unfug, weil man die Objekte verändern könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460327</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 21 Feb 2008 15:50:37 GMT</pubDate></item></channel></rss>