<?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[Klasse in Klasse verwenden]]></title><description><![CDATA[<p>Hi <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>
<p>Heute habe ich mich mal an meinem ersten C++-Programm versucht <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>
<p>Leider habe ich noch ein Problem, wenn ich in einer Klasse diese Klasse auch als Eigenschaft angegeben will. Wie muss ich denn das machen?</p>
<p>Hier mein Versuch:</p>
<pre><code>#ifndef EDGE_H
#define EDGE_H

#include &quot;Face.h&quot;
#include &quot;Vertex.h&quot;

class Edge
{
    public:
        Edge(Vertex, Vertex);
        void setLeft(Face, Edge, Edge);
        void setRight(Face, Edge, Edge);
        Face getLeftFace();
        Face getRightFace();
        Edge getLeftSuccessorEdge();
        Edge getRightSuccessorEdge();
        Edge getLeftPredecessorEdge();
        Edge getRightPredecessorEdge();
    private:
        Vertex startPoint;
        Vertex endPoint;
        Face leftFace;
        Face rightFace;
        Edge leftSuccessorEdge;
        Edge rightSuccessorEdge;
        Edge leftPredecessorEdge;
        Edge rightPredecessorEdge;
};

#endif // EDGE_H
</code></pre>
<pre><code>#include &quot;Edge.h&quot;

Edge::Edge(Vertex _startPoint, Vertex _endPoint)
{
    startPoint = _startPoint;
    endPoint = _endPoint;
}
void Edge::setLeft(Face _face, Edge _successorEdge, Edge _predecessorEdge)
{
    leftFace = _face;
    leftSuccessorEdge = _successorEdge;
    leftPredecessorEdge = _predecessorEdge;
}
void Edge::setRight(Face _face, Edge _successorEdge, Edge _predecessorEdge)
{
    rightFace = _face;
    rightSuccessorEdge = _successorEdge;
    rightPredecessorEdge = _predecessorEdge;
}
Face Edge::getLeftFace()
{
    return leftFace;
}
Face Edge::getRightFace()
{
    return rightFace;
}
Edge Edge::getLeftSuccessorEdge()
{
    return leftSuccessorEdge;
}
Edge Edge::getRightSuccessorEdge()
{
    return rightSuccessorEdge;
}
Edge Edge::getLeftPredecessorEdge()
{
    return leftPredecessorEdge;
}
Edge Edge::getRightPredecessorEdge()
{
    return rightPredecessorEdge;
}
</code></pre>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;exception&gt;
#include &lt;stdexcept&gt;
#include &quot;Edge.h&quot;
#include &quot;Face.h&quot;
#include &quot;Vertex.h&quot;

using namespace std;

void terminateHandler()
{
    // Exceptionhandling nicht korrekt abgelaufen
    cerr &lt;&lt; &quot;Exception&quot; &lt;&lt; endl;
    abort();
}
int main(int argc, char *argv[])
{

    try
    {
        set_terminate(terminateHandler);

        Vertex leftSuccessorStartPoint(100.0, 200.0, 300.0);
        Vertex leftSeccessorEndPoint(101.0, 201.0, 301.0);
        Vertex leftPredecessorStartPoint(400.0, 500.0, 600.0);
        Vertex leftPredecessorEndPoint(501.0, 501.0, 601.0);
        Vertex rightSuccessorStartPoint(110.0, 210.0, 310.0);
        Vertex rightSeccessorEndPoint(111.0, 211.0, 311.0);
        Vertex rightPredecessorStartPoint(410.0, 510.0, 610.0);
        Vertex rightPredecessorEndPoint(511.0, 511.0, 611.0);

        Edge leftSuccessorEdge(leftSuccessorStartPoint, leftSeccessorEndPoint);
        Edge leftPredecessorEdge(leftPredecessorStartPoint, leftPredecessorEndPoint);
        Edge rightSuccessorEdge(rightSuccessorStartPoint, rightSeccessorEndPoint);
        Edge rightPredecessorEdge(rightPredecessorStartPoint, rightPredecessorEndPoint);

        Face leftFace;
        Face rightFace;

        Vertex startPoint(1, 2, 3);
        Vertex endPoint(4, 5, 6);

        Edge edge(startPoint, endPoint);
        edge.setLeft(leftFace, leftSuccessorEdge, leftPredecessorEdge);
        edge.setRight(rightFace, rightSuccessorEdge, rightPredecessorEdge);
    }
    catch(const string what)
    {
        cerr &lt;&lt; &quot;Exception: &quot; &lt;&lt; what &lt;&lt; endl;
        return EXIT_FAILURE;
    }
    catch(bad_exception&amp; exc)
    {
        // Fehlerbehandlung liefert selbst einen Fehler
        cerr &lt;&lt; &quot;Exception: &quot; &lt;&lt; exc.what() &lt;&lt; endl;
        return EXIT_FAILURE;
    }
    catch(exception&amp; exc)
    {
        // Fehler im Programm
        cerr &lt;&lt; &quot;Exception: &quot; &lt;&lt; exc.what() &lt;&lt; endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}
</code></pre>
<p>Fehlermeldungen:</p>
<blockquote>
<p>||=== Build: Debug in a3dds (compiler: GNU GCC Compiler) ===|<br />
include\Edge.h|24|error: field 'leftSuccessorEdge' has incomplete type|<br />
include\Edge.h|25|error: field 'rightSuccessorEdge' has incomplete type|<br />
include\Edge.h|26|error: field 'leftPredecessorEdge' has incomplete type|<br />
include\Edge.h|27|error: field 'rightPredecessorEdge' has incomplete type|<br />
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 22 second(s)) ===|</p>
</blockquote>
<p>Habe im Internet gelesen, dass man noch ein * dazumachen muss, aber das liefert mir auch wieder nur Fehler. Wie geht es denn richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324288/klasse-in-klasse-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 15:27:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324288.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 10 Mar 2014 23:25:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Mon, 10 Mar 2014 23:26:41 GMT]]></title><description><![CDATA[<p>Hi <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>
<p>Heute habe ich mich mal an meinem ersten C++-Programm versucht <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>
<p>Leider habe ich noch ein Problem, wenn ich in einer Klasse diese Klasse auch als Eigenschaft angegeben will. Wie muss ich denn das machen?</p>
<p>Hier mein Versuch:</p>
<pre><code>#ifndef EDGE_H
#define EDGE_H

#include &quot;Face.h&quot;
#include &quot;Vertex.h&quot;

class Edge
{
    public:
        Edge(Vertex, Vertex);
        void setLeft(Face, Edge, Edge);
        void setRight(Face, Edge, Edge);
        Face getLeftFace();
        Face getRightFace();
        Edge getLeftSuccessorEdge();
        Edge getRightSuccessorEdge();
        Edge getLeftPredecessorEdge();
        Edge getRightPredecessorEdge();
    private:
        Vertex startPoint;
        Vertex endPoint;
        Face leftFace;
        Face rightFace;
        Edge leftSuccessorEdge;
        Edge rightSuccessorEdge;
        Edge leftPredecessorEdge;
        Edge rightPredecessorEdge;
};

#endif // EDGE_H
</code></pre>
<pre><code>#include &quot;Edge.h&quot;

Edge::Edge(Vertex _startPoint, Vertex _endPoint)
{
    startPoint = _startPoint;
    endPoint = _endPoint;
}
void Edge::setLeft(Face _face, Edge _successorEdge, Edge _predecessorEdge)
{
    leftFace = _face;
    leftSuccessorEdge = _successorEdge;
    leftPredecessorEdge = _predecessorEdge;
}
void Edge::setRight(Face _face, Edge _successorEdge, Edge _predecessorEdge)
{
    rightFace = _face;
    rightSuccessorEdge = _successorEdge;
    rightPredecessorEdge = _predecessorEdge;
}
Face Edge::getLeftFace()
{
    return leftFace;
}
Face Edge::getRightFace()
{
    return rightFace;
}
Edge Edge::getLeftSuccessorEdge()
{
    return leftSuccessorEdge;
}
Edge Edge::getRightSuccessorEdge()
{
    return rightSuccessorEdge;
}
Edge Edge::getLeftPredecessorEdge()
{
    return leftPredecessorEdge;
}
Edge Edge::getRightPredecessorEdge()
{
    return rightPredecessorEdge;
}
</code></pre>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;
#include &lt;exception&gt;
#include &lt;stdexcept&gt;
#include &quot;Edge.h&quot;
#include &quot;Face.h&quot;
#include &quot;Vertex.h&quot;

using namespace std;

void terminateHandler()
{
    // Exceptionhandling nicht korrekt abgelaufen
    cerr &lt;&lt; &quot;Exception&quot; &lt;&lt; endl;
    abort();
}
int main(int argc, char *argv[])
{

    try
    {
        set_terminate(terminateHandler);

        Vertex leftSuccessorStartPoint(100.0, 200.0, 300.0);
        Vertex leftSeccessorEndPoint(101.0, 201.0, 301.0);
        Vertex leftPredecessorStartPoint(400.0, 500.0, 600.0);
        Vertex leftPredecessorEndPoint(501.0, 501.0, 601.0);
        Vertex rightSuccessorStartPoint(110.0, 210.0, 310.0);
        Vertex rightSeccessorEndPoint(111.0, 211.0, 311.0);
        Vertex rightPredecessorStartPoint(410.0, 510.0, 610.0);
        Vertex rightPredecessorEndPoint(511.0, 511.0, 611.0);

        Edge leftSuccessorEdge(leftSuccessorStartPoint, leftSeccessorEndPoint);
        Edge leftPredecessorEdge(leftPredecessorStartPoint, leftPredecessorEndPoint);
        Edge rightSuccessorEdge(rightSuccessorStartPoint, rightSeccessorEndPoint);
        Edge rightPredecessorEdge(rightPredecessorStartPoint, rightPredecessorEndPoint);

        Face leftFace;
        Face rightFace;

        Vertex startPoint(1, 2, 3);
        Vertex endPoint(4, 5, 6);

        Edge edge(startPoint, endPoint);
        edge.setLeft(leftFace, leftSuccessorEdge, leftPredecessorEdge);
        edge.setRight(rightFace, rightSuccessorEdge, rightPredecessorEdge);
    }
    catch(const string what)
    {
        cerr &lt;&lt; &quot;Exception: &quot; &lt;&lt; what &lt;&lt; endl;
        return EXIT_FAILURE;
    }
    catch(bad_exception&amp; exc)
    {
        // Fehlerbehandlung liefert selbst einen Fehler
        cerr &lt;&lt; &quot;Exception: &quot; &lt;&lt; exc.what() &lt;&lt; endl;
        return EXIT_FAILURE;
    }
    catch(exception&amp; exc)
    {
        // Fehler im Programm
        cerr &lt;&lt; &quot;Exception: &quot; &lt;&lt; exc.what() &lt;&lt; endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}
</code></pre>
<p>Fehlermeldungen:</p>
<blockquote>
<p>||=== Build: Debug in a3dds (compiler: GNU GCC Compiler) ===|<br />
include\Edge.h|24|error: field 'leftSuccessorEdge' has incomplete type|<br />
include\Edge.h|25|error: field 'rightSuccessorEdge' has incomplete type|<br />
include\Edge.h|26|error: field 'leftPredecessorEdge' has incomplete type|<br />
include\Edge.h|27|error: field 'rightPredecessorEdge' has incomplete type|<br />
||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 22 second(s)) ===|</p>
</blockquote>
<p>Habe im Internet gelesen, dass man noch ein * dazumachen muss, aber das liefert mir auch wieder nur Fehler. Wie geht es denn richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388154</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Mon, 10 Mar 2014 23:26:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 00:22:26 GMT]]></title><description><![CDATA[<p>Wie soll das denn gehen? Eine edge enthält eine edge, enthält eine edge, enthält eine edge, usw?</p>
<p>Da stimmt was nicht im Design. Der Tipp, das stattdessen mit Zeigern zu machen, wäre durchaus eine Lösung. Aber falls du nicht weißt, was ein Zeiger ist, solltest du da auf keinen Fall anfangen, wild Sternchen zu verteilen, bis es compiliert.<br />
Vom Rest deines Programms her vermute ich mal, dass du weder von Referenzen, noch von Zeigern, jemals etwas gehört hast, oder? Falls dies der Fall ist, lern erst einmal ein bisschen weiter C++, bis du Referenzen und Zeiger gelernt hast, dann wird dir das Problem und die Lösung ganz von alleine klar. Das Thema Referenzen/Zeiger ist jedoch zu komplex, um im Rahmen dieses Forums erklärt zu werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388157</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 11 Mar 2014 00:22:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 06:33:28 GMT]]></title><description><![CDATA[<p>Ich weiß schon grundsätzlich, was ein Zeiger ist. Und die Datenstruktur stimmt, das ist nichts, was ich selbst erfunden habe.</p>
<p>Wenn du mir hilfst, das Problem zu lösen, kläre ich dich über diese Datenstruktur auf <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/2388168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388168</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Tue, 11 Mar 2014 06:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 06:43:37 GMT]]></title><description><![CDATA[<p>Nein, sie stimmt so nicht.</p>
<p>Wenn das z.B. aus Java übernommen hast, wäre das nicht das gleiche.</p>
<p>Wie SeppJ schon sagte: Du brauchst eine Art von Referenzierung (Referenz oder (Smart-)Zeiger) auf die Kinder-Edges. Ansonsten hast du einen zyklus der nicht aufgebrochen werden kann, weder vom Programmier noch vom Compiler. Die Folge wäre ein unendlich großes Objekt, was ja offensichtlich nicht existieren kann.</p>
<p>Soll das irgendwas Baumartiges sein ? (Quadtree, Octree, Neuronales Netz?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388170</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 11 Mar 2014 06:43:37 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 07:19:45 GMT]]></title><description><![CDATA[<blockquote>
<p>Soll das irgendwas Baumartiges sein ? (Quadtree, Octree, Neuronales Netz?)</p>
</blockquote>
<p>Diese Datenstruktur nennt sich &quot;winged-edge&quot;. Das ist eine Alternative zu B-Reps. Die werden für 3D-Programme verwendet.</p>
<blockquote>
<p>Du brauchst eine Art von Referenzierung</p>
</blockquote>
<p>Ja, das habe ich auch schon kapiert. C++ kann das nicht kompilieren, weil es beim Kompilieren der Klasse die Klasse halt noch nicht kennt.</p>
<p>Naja, ich werds halt alleine versuchen, das irgendwie mit Zeiger hinzubekommen. Vielleicht braucht ich die auch gar nicht, sondern kann mit Vector arbeiten ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388171</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Tue, 11 Mar 2014 07:19:45 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 08:10:49 GMT]]></title><description><![CDATA[<p>tröröö schrieb:</p>
<blockquote>
<p>Vielleicht braucht ich die auch gar nicht, sondern kann mit Vector arbeiten ...</p>
</blockquote>
<p>Da bist du vermutlich irgendwo auf den Tipp gestoßen, ein C-Array (&quot;irgendwas mit Sternchen&quot;) durch einen vector zu ersetzen.</p>
<p>Das hat mit deinem Problem nichts zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388177</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 11 Mar 2014 08:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 08:22:01 GMT]]></title><description><![CDATA[<p>Naja, theoretisch ginge das schon mit einem Vector. Aber die semantische Zuordnung (alá LeftEdge, RightEdge oder wie das war) wäre nicht mehr gegeben.</p>
<p>Für mich sieht das so auf den ersten Blick schon nach einer Struktur aus, die man mit Zeigern umsetzt. Aber da müsste tröörö sich halt um den Speicher kümmern.</p>
<p>(Ich will an der Stelle jetzt gar nichts für oder gegen Smart-Pointer sagen. Die sind ja in letzter Zeit hier im Forum gerade bei Baumstrukturen mal geliebt mal total verpöhnt.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388178</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 11 Mar 2014 08:22:01 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 08:35:28 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Naja, theoretisch ginge das schon mit einem Vector. Aber die semantische Zuordnung (alá LeftEdge, RightEdge oder wie das war) wäre nicht mehr gegeben.</p>
</blockquote>
<p>Nein, sowas geht nicht:</p>
<pre><code class="language-cpp">class Edge
{
  std::vector&lt;Edge&gt; edges;
}
</code></pre>
<p>Sein eigentliches Problem ist doch, dass die Klasse &quot;Edge&quot; Member der Klasse &quot;Edge&quot; hält. Egal, ob diese individuelle Member sind oder in einem vector gehalten werden.</p>
<p>Das lässt sich nur durch Verwendung von Referenzen/Pointern aufbrechen. Natürlich *könnte* man diese Pointer dann in einem vector halten, aber das ist jetzt erstmal wurscht <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/2388179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388179</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 11 Mar 2014 08:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 08:44:08 GMT]]></title><description><![CDATA[<p>Warte, jetzt bring mich nicht in Bedrängnis. Das geht echt nicht mit dem Vector??!<br />
Das probier ich aus... <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="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388180</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 11 Mar 2014 08:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 08:46:28 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Warte, jetzt bring mich nicht in Bedrängnis. Das geht echt nicht mit dem Vector??!</p>
</blockquote>
<p>achnee, warte mal, der könnte ja auch leer sein.</p>
<p>nein, vielleicht gehts doch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388181</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 11 Mar 2014 08:46:28 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 08:47:56 GMT]]></title><description><![CDATA[<p>Also laut Ideone gehts:</p>
<pre><code>#include &lt;vector&gt;

class X
{
	std::vector&lt;X&gt; vx;

public:
	X()
	: vx{{}, {}, {}}
	{}
};

int main()
{
	X x;
	return 0;
}
</code></pre>
<p>Und hier ist sogar noch das &quot;Phänomen&quot;, dass ein Laufzeitfehler erzeugt wird, weil ein Zyklus bei der Initialisierung stattfindet.</p>
<p>Aber ist eigentlich auch logisch, weil vector einen Pointer auf T hat und sich um Speicher und alles selbst kümmert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388183</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 11 Mar 2014 08:47:56 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 09:28:25 GMT]]></title><description><![CDATA[<p>ok, danke für die Klarstellung.</p>
<p>Aber weiterhin gilt: zwei Instanzen können sich nicht gegenseitig beinhalten.</p>
<p>Es funktioniert somit zwar für eine Baumstruktur, bei der nur in eine Richtung navigiert werden kann. Sowie aber in beide Richtungen navigiert werden soll oder sich zyklische Strukturen ergeben, ist Ende.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388187</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 11 Mar 2014 09:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 09:53:18 GMT]]></title><description><![CDATA[<p>Folgende Aussagen nur unter der Prämisse, dass ich das richtig verstehe, was du meinst (nicht dass wir aneinander vorbei reden):</p>
<p>Doch klar geht das in beide Richtungen.<br />
In einem Binärbaum z.B. kennt jeder Knoten seinen Elternknoten und auch seine (beiden) Kindknoten.<br />
Das einzige, wodrauf man aufpassen muss, ist beim Löschen. Nicht dass aus Versehen der ganze Baum gelöscht wird.</p>
<p>Oder verstehe ich dich da falsch bei den zyklischen Strukturen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388190</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388190</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 11 Mar 2014 09:53:18 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 11:46:05 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Folgende Aussagen nur unter der Prämisse, dass ich das richtig verstehe, was du meinst (nicht dass wir aneinander vorbei reden):</p>
</blockquote>
<p>mir geht es immer noch um die Modellierung *ohne Pointer/Referenzen*.</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Doch klar geht das in beide Richtungen.<br />
In einem Binärbaum z.B. kennt jeder Knoten seinen Elternknoten und auch seine (beiden) Kindknoten.</p>
</blockquote>
<p>ok, modellieren wir das doch mal:</p>
<p>A<br />
B1<br />
C1 C2</p>
<p>A kennt B1 (Kind) und C1/C2 kennen B (parent). Wie sollen nun sowohl A als auch C1 und C2 den Knoten B1 halten, dass alle auf dieselbe Instanz zugreifen (ohne Pointer/Referenzen!)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388216</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 11 Mar 2014 11:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 12:25:14 GMT]]></title><description><![CDATA[<p>Gar nicht, aber genau das wollte ich ja ausschließen; da haben wir aneinander vorbei geredet.</p>
<p>Selbst wenn A nur B(Kind) kennen soll, und wir modellieren das ohne Zeiger, geht das schon nicht.</p>
<pre><code>struct Node
{
    Node child;
};

int main()
{
    Node A;
    Node B;
    A.child = B;

    // ...
}
</code></pre>
<p>Wird nicht laufen.<br />
Wenn das aber verschiedene Typen sind, dann geht das wiederum. Aber auch nur, wie du sagst, in eine Richtung:</p>
<pre><code>struct NodeB
{
    //NodeA child;
};

struct NodeA
{
    NodeB child;
};

int main()
{
    NodeA a;
    NodeB b;
    a.child = b;
//    b.child = a;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2388240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388240</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 11 Mar 2014 12:25:14 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 12:29:50 GMT]]></title><description><![CDATA[<p>ok, dann hätten wir das auch geklärt <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/2388241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388241</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 11 Mar 2014 12:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 13:06:19 GMT]]></title><description><![CDATA[<p>Es handelt sich hier nicht um eine Baumstruktur, wenn ich mich nicht sehr täusche, sondern eher um eine Art Netz. Insbesondere können (und werden) zyklische Objektverweisgruppen entstehen, indem etwa -- jetzt unter der Annahme, dass das alles auf Zeiger umgestellt wäre -- this-&gt;LeftSuccessorEdge()-&gt;LeftSuccessorEdge()-&gt;LeftSuccessorEdge() == this wird.</p>
<p>In einer Baumstruktur wären die Besitzverhältnisse mit unique_ptr einfach zu lösen; hier ist es schwieriger. shared_ptr reicht nicht, da der Graph zyklisch ist, und ich sehe keine einfache Möglichkeit, das mit weak_ptr aufzubrechen.</p>
<p>Ich würde mir wahrscheinlich eine Graphenkopfklasse bauen, die die Edges, Faces und Vertices besitzt und ihre Lebensdauer festlegt, und in den Edges, Faces und Vertices selbst mit nackten Zeigern arbeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388250</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 11 Mar 2014 13:06:19 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 14:39:38 GMT]]></title><description><![CDATA[<pre><code>struct Node
{
    Node child;
};
</code></pre>
<p>Kann nicht funktionieren. Der Compiler reserviert für die Klasse so viel Speicher, wie für jedes einzelne Element benötigt wird. Hat eine Klasse beispielsweise 2 Member vom Typ int, dann ist die gesamte Klasse eben 2*sizeof(int) groß. Wie groß ist jetzt Node? In dem Beispiel sizeof(Node). Da erkennt man schon die Rekursion der Fragestellung. Man bedenke, dass eine Instanz <code>a</code> einen Member a.child hätte, welches ein Member a.child.child hätte, welches einen Member a.child.child.child hätte...</p>
<p>Ein Zeiger auf Node wäre ok, da sizeof(Node*) bereits exakt definiert ist. Auch ein std::vector&lt;Node&gt; ist ok, da der vector intern ja auch nur ein Zeiger auf die Elemente hält. Ein Node[6] funktioniert wiederum nicht, da dort wieder das gleiche Problem auftritt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388275</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388275</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Tue, 11 Mar 2014 14:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Tue, 11 Mar 2014 17:25:38 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Auch ein std::vector&lt;Node&gt; ist ok</p>
</blockquote>
<p>Nein, ist es nicht. Templates in der Standardbibliothek verlangen vollständige Typen als Parameter, ausser es steht explizit was anderes (wie z.B. bei <code>unique_ptr</code> ).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388321</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 11 Mar 2014 17:25:38 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Wed, 12 Mar 2014 07:43:11 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>tntnet schrieb:</p>
<blockquote>
<p>Auch ein std::vector&lt;Node&gt; ist ok</p>
</blockquote>
<p>Nein, ist es nicht. Templates in der Standardbibliothek verlangen vollständige Typen als Parameter, ausser es steht explizit was anderes (wie z.B. bei <code>unique_ptr</code> ).</p>
</blockquote>
<p>Jetzt hast Du mich aber erfolgreich irritiert. Also zumindest bin ich mir unsicher. Hast Du da einen Verweis auf den Standard? <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>
<p>Am Ende der Klassendeklaration ist die Klasse vollständig bekannt. Der Compiler weiß, ob die Klasse alle Voraussetzungen erfüllt. Daher kann er erst mal seine Arbeit erledigen.</p>
<p>Und auch wenn die compilierbarkeit mit einem Compiler kein Beweis ist, ist es erst mal ein Hinweis, dass es so sein könnte und näherer Betrachtung Wert ist. Ich habe hier mal ein Beispiel:</p>
<pre><code>#include &lt;vector&gt;

struct Foo
{
    std::vector&lt;Foo&gt; childs;
};
</code></pre>
<p>Mit <code>g++ -Wall -pedantic -c foo.cpp</code> übersetzt ergibt keinen Fehler und noch nicht mal eine Warnung. Die gcc-version ist 4.7.2. Ist der Code standardkonform?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388391</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 12 Mar 2014 07:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Wed, 12 Mar 2014 08:07:50 GMT]]></title><description><![CDATA[<pre><code>[...] The template parameter T of unique_ptr may be an incomplete type.
</code></pre>
<p>Aber mehr finde ich jetzt grad nicht zu irgendwelchen (un-)vollständigen Typen in der STL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388393</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Wed, 12 Mar 2014 08:07:50 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Wed, 12 Mar 2014 10:20:52 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<pre><code>[...] The template parameter T of unique_ptr may be an incomplete type.
</code></pre>
<p>Aber mehr finde ich jetzt grad nicht zu irgendwelchen (un-)vollständigen Typen in der STL.</p>
</blockquote>
<p>17.6.4.8/2</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388412</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 12 Mar 2014 10:20:52 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Wed, 12 Mar 2014 13:17:29 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<pre><code>[...] The template parameter T of unique_ptr may be an incomplete type.
</code></pre>
<p>Aber mehr finde ich jetzt grad nicht zu irgendwelchen (un-)vollständigen Typen in der STL.</p>
</blockquote>
<p>17.6.4.8/2</p>
</blockquote>
<p>Könntest Du auch den Abschnitt hier posten? Ich habe keinen Standard hier zur Hand und das geht bestimmt vielen so.</p>
<p>Mich würde auch interessieren, ob das so, wie es im Beispiel ist, wirklich als &quot;incomplete type&quot; zu interpretieren ist.</p>
<p>Im übrigen compiliert der Code aus mit IBM xlc mit eingeschalteten Warnungen (-qinfo) ohne Fehler und Warnung. Und der Compiler meckert wirklich über jede Kleinigkeit. Das verstärkt meine Annahme, dass es sich doch um korrekten Code handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2388441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388441</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Wed, 12 Mar 2014 13:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Wed, 12 Mar 2014 13:26:41 GMT]]></title><description><![CDATA[<blockquote>
<p>In certain cases ([...] operations on types used to instantiate standard library template components), the C ++ standard library depends on components supplied by a C ++ program. If these components do not meet their requirements, the Standard places no requirements on the implementation.<br />
In particular, the effects are undefined in the following cases:<br />
— if an incomplete type (3.9) is used as a template argument when instantiating a template component, <strong>unless specifically allowed for that component</strong>.</p>
</blockquote>
<blockquote>
<p>Mich würde auch interessieren, ob das so, wie es im Beispiel ist, wirklich als &quot;incomplete type&quot; zu interpretieren ist.</p>
</blockquote>
<p>Ja:</p>
<blockquote>
<p>A class is considered a completely-defined object type (3.9) (or complete type) at the closing } of the <em>class-specifier</em>. Within the class <em>member-specification</em>, the class is regarded as complete within function bodies, default arguments, <em>using-declarations</em> introducing inheriting constructors (12.9), <em>exception-specifications</em>, and <em>brace-or-equal-initializers</em> for non-static data members (including such things in nested classes). Otherwise it is regarded as incomplete within its own class member-specification.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2388442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388442</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 12 Mar 2014 13:26:41 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Wed, 12 Mar 2014 15:25:09 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Ich habe keinen Standard hier zur Hand und das geht bestimmt vielen so.</p>
</blockquote>
<p>DirkB schrieb:</p>
<blockquote>
<p>Schau mal im Thras : <a href="http://www.c-plusplus.net/forum/310212" rel="nofollow">Linkliste für Neulinge</a> nach.<br />
Da gibt es Links zu den Drafts der Standards.</p>
</blockquote>
<p>Importiert und angepasst aus dem C Forum. Danke an DirkB. <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/2388473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2388473</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Wed, 12 Mar 2014 15:25:09 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse in Klasse verwenden on Sat, 15 Mar 2014 20:36:59 GMT]]></title><description><![CDATA[<blockquote>
<p>In einer Baumstruktur wären die Besitzverhältnisse mit unique_ptr einfach zu lösen; hier ist es schwieriger. shared_ptr reicht nicht, da der Graph zyklisch ist, und ich sehe keine einfache Möglichkeit, das mit weak_ptr aufzubrechen.</p>
<p>Ich würde mir wahrscheinlich eine Graphenkopfklasse bauen, die die Edges, Faces und Vertices besitzt und ihre Lebensdauer festlegt, und in den Edges, Faces und Vertices selbst mit nackten Zeigern arbeiten.</p>
</blockquote>
<p>Ich verstehe nur Bahnhof <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="😃"
    /></p>
<p>Welche Probleme gibt es denn, wenn man es mit shared_ptr versucht? Und was meinst mit Lebensdauer?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2389129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2389129</guid><dc:creator><![CDATA[tröröö]]></dc:creator><pubDate>Sat, 15 Mar 2014 20:36:59 GMT</pubDate></item></channel></rss>