<?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[Klassenteile in versch. Dateien aufspalten]]></title><description><![CDATA[<p>Sry für den aussagelosen Namen - wenn jmd nen besseren Name hat, kann ichs auch ändern ^^</p>
<p>Die Frage an sich ist relativ kurz:<br />
Haltet ihr so etwas für sinnvoll (nicht, die liste neu zu schreiben - das ist relativ sinnfrei, aber ok - es geht nur um die iteratoren, ob man sie in ne extra datei schreiben sollte und dann ausnutzen sollte, dass include nur ne textuelle ersetzung durchführt oder ob ihr es in die gleiche datei schreiben würdet):</p>
<pre><code class="language-cpp">/*list.h*/

template &lt;class T&gt;
class list :	public list_base &lt;T&gt; //typedefs
{
//iterators:
	struct node;
	#include &quot;list_iterators.h&quot;
public:
	typedef Titerator iterator;
	typedef Tconst_iterator const_iterator;
/*...*/
};
</code></pre>
<pre><code class="language-cpp">/*list_iterators.h*/
struct Titerator :	my::typedefs::iterator_base&lt;value_type, std::bidirectional_iterator_tag, size_type&gt; //...
{
	friend list;
	friend struct Tconst_iterator;
public:
/*...*/
};

//struct Tconst_iterator : /*...*/ { /*...*/ };
</code></pre>
<p>Das gleiche hab ich dann noch mal für die std::swap-Spezialisierung (die dann aber logischerweiße ganz am Ende erst included wird und nicht in der class-definition) gemacht - bin mir nur gerade nicht mehr sicher, ob es sinnvoll war oder nicht - und falls ja, wie weit man das ganze treiben sollte...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241357/klassenteile-in-versch-dateien-aufspalten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 11:28:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241357.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 May 2009 14:53:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 14:53:58 GMT]]></title><description><![CDATA[<p>Sry für den aussagelosen Namen - wenn jmd nen besseren Name hat, kann ichs auch ändern ^^</p>
<p>Die Frage an sich ist relativ kurz:<br />
Haltet ihr so etwas für sinnvoll (nicht, die liste neu zu schreiben - das ist relativ sinnfrei, aber ok - es geht nur um die iteratoren, ob man sie in ne extra datei schreiben sollte und dann ausnutzen sollte, dass include nur ne textuelle ersetzung durchführt oder ob ihr es in die gleiche datei schreiben würdet):</p>
<pre><code class="language-cpp">/*list.h*/

template &lt;class T&gt;
class list :	public list_base &lt;T&gt; //typedefs
{
//iterators:
	struct node;
	#include &quot;list_iterators.h&quot;
public:
	typedef Titerator iterator;
	typedef Tconst_iterator const_iterator;
/*...*/
};
</code></pre>
<pre><code class="language-cpp">/*list_iterators.h*/
struct Titerator :	my::typedefs::iterator_base&lt;value_type, std::bidirectional_iterator_tag, size_type&gt; //...
{
	friend list;
	friend struct Tconst_iterator;
public:
/*...*/
};

//struct Tconst_iterator : /*...*/ { /*...*/ };
</code></pre>
<p>Das gleiche hab ich dann noch mal für die std::swap-Spezialisierung (die dann aber logischerweiße ganz am Ende erst included wird und nicht in der class-definition) gemacht - bin mir nur gerade nicht mehr sicher, ob es sinnvoll war oder nicht - und falls ja, wie weit man das ganze treiben sollte...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712849</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 19 May 2009 14:53:58 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 15:17:57 GMT]]></title><description><![CDATA[<p>Naja, wenn du den List-Iterator als eigenständige Klasse bestehen lassen kannst (d.h. auch ohne die list), dann kann das durchaus sinnvoll sein, ihn auch in einem eigenen Sourcecode zu haben. Ich bin zur zeit dabei, einen std::vector zu implementieren (genauso sinnfrei <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />) und lagere die verschiedenen verwendeten Klassen auch aus: einen <code>array_iterator</code> als Iteratorklasse und eine Klasse <code>mem_chunk</code> für die Verwaltung von unitialisiertem Speicher. Eine weitere kleine Hilfsklasse die nur im vector selber Sinn macht hab ich auch in der Datei für den vector gelassen, sie macht eigenständig keinen Sinn und ist nicht so groß dass es sich lohnen würde sie auszulagern (kann aber noch passieren beim einen oder anderen Refactoring).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712862</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 May 2009 15:17:57 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 15:55:09 GMT]]></title><description><![CDATA[<p>Da es mich gerade auch interessieren würde, füge ich noch eine Möglichkeit dazu mit angehängter Frage <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>
<pre><code class="language-cpp">namespace deinNamespace {
  // ...

namespace detail {
  // ...

  class ListIterator // ...

} // detail

  // ...

  class List
  {
  public:
    typedef detail::ListIterator iterator;
  };

} // deinNamespace
</code></pre>
<p>Was spricht gegen eine solche Möglichkeit? Man könnte auch die Deklaration von <code>Iterator</code> in ein eigenes File auslagern, halt einfach nicht in der Klasse <code>List</code> behalten. Ich mag diese Subklassen nicht so, sieht einfach hässlich aus <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712872</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 19 May 2009 15:55:09 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 20:48:40 GMT]]></title><description><![CDATA[<p>Ich mag die Subklassen auch nicht so - allerdings find ich die auslagerung in namespaces auch net so hübsch - außerdem muss man dann den ganzen template müll wieder beachten:</p>
<pre><code class="language-cpp">namespace detail
{
  template &lt;typename T&gt;
  struct node_base
  {
    //
  };

  template &lt;typename T&gt;
  struct node : node_base&lt;T&gt;
  {
    T val;
  };

  template &lt;typename T&gt;
  struct base_iterator
  {
    friend template &lt;typename T&gt; struct list&lt;T&gt;; //oder so in etwa, weiß ich gerad net ausm kopf ^^
    typedef T value_type;
    /* übrige typedefs */;
  };

/*iterator + const_iterator*/
}

template &lt;typename T&gt;
class list
{
public:
  //typedef auf node, base_node, iterator und const_iterator

/*impl.*/
};
</code></pre>
<p>also irgendwie siehts nich viel besser aus... aber man könnte evtl wenigsten die includes an die richtige stelle setzen - mehr vorteile fallen mir hier aber nich ein ^^<br />
z.bsp. braucht man ja &lt;algorithm&gt; für std::swap, den man da net includen kann, dann noch &lt;iterator&gt; für iteratoren für std::bidirectional_iterator_tag und hat beide ganz oben in list.h stehen, obwohl sie da net so wirklich hingehören...</p>
<p>falls du nach den ganzen punkten von oben immernoch meinst, dass es sauberer/besser wäre, dann sag das ma pls, dann mach ich das auch so ^^<br />
ich könnte aber dort noch nen einfaches struct drum rum machen, damit ich das template zeugs net jedes ma aufs neue schreiben muss - oder was meinst du dazu?</p>
<p>bb</p>
<p>PS: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: auch studium oder wieso vector implementieren? ^^</p>
<p>edit: node_base muss doch kein template sein ^^<br />
würde ja nur so in etwa aussehen:</p>
<pre><code class="language-cpp">struct node_base
{
	node_base *next;
	node_base *prev;

	node_base() {}
	node_base(node_base* _next, node_base* _prev) : next(_next), prev(_prev) {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1713010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713010</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 19 May 2009 20:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 21:03:20 GMT]]></title><description><![CDATA[<p>Entweder bin ich grad etwas müde oder ... ka, mein Hirn hat womöglich geschlossen, aber ich verstehe irgendwie eine Punkte nicht, welche du aufführst.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>außerdem muss man dann den ganzen template müll wieder beachten</p>
</blockquote>
<p>Wo ist hier der Unterschied zu dienem System? Was für einen Müll gibt es da speziell zu beachten, was es sonst nicht gäbe?</p>
<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">/* ... */ friend /* ... */
</code></pre>
</blockquote>
<p>Wieso brauchst du ein <code>friend</code> in <code>iterator_base</code> ?</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>also irgendwie siehts nich viel besser aus...</p>
</blockquote>
<p>Optimal definitiv nicht, aber vielleicht doch etwas besser <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>unskilled schrieb:</p>
<blockquote>
<p>... aber man könnte evtl wenigsten die includes an die richtige stelle setzen - mehr vorteile fallen mir hier aber nich ein ^^</p>
</blockquote>
<p>Ehm, wie bitte? Meinst du sie jetzt oben stehen statt in der Klasse? Also quasi ein <code>#include &quot;ListIteratorsDetail.hpp&quot;</code> oben bei <strong>List.hpp</strong>?</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>z.bsp. braucht man ja &lt;algorithm&gt; für std::swap, den man da net includen kann, dann noch &lt;iterator&gt; für iteratoren für std::bidirectional_iterator_tag und hat beide ganz oben in list.h stehen, obwohl sie da net so wirklich hingehören...</p>
</blockquote>
<p>Keine Ahnung, was du damit ausdrücken willst. Wieso gehören sie dort nicht hin? Wieso in <strong>list.h</strong>? Du könntest sie ja auch auslagern zum File mit den Iteratoren. Was willst du hier aussagen? <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>unskilled schrieb:</p>
<blockquote>
<p>falls du nach den ganzen punkten von oben immernoch meinst, dass es sauberer/besser wäre, dann sag das ma pls, dann mach ich das auch so ^^</p>
</blockquote>
<p>Ich frage ja selber :p</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>ich könnte aber dort noch nen einfaches struct drum rum machen, damit ich das template zeugs net jedes ma aufs neue schreiben muss - oder was meinst du dazu?</p>
</blockquote>
<p>Was? Das Problem ist, dass du immer wieder <code>template&lt;typename T&gt;</code> hinschreiben musst? *ungläubisch schaut, dass jemand dies als Problem sehen kann* <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>unskilled schrieb:</p>
<blockquote>
<p>PS: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: auch studium oder wieso vector implementieren? ^^</p>
</blockquote>
<p>Nein, er implementiert einen Vektor für seinen dritten Artikel, wo er WIEDER AUF BOOST::OPERATORS EINGEHT, STATT SEIN VERSPRECHEN AUS DEM ERSTEN ARTIKEL ZU HALTEN ... dort hat er nämlich gesagt, er würde im zweiten Artikel etwas über die Operatoren <code>new</code> und <code>new[]</code> sagen.<br />
-&gt;</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Eine umfassende Besprechung der Speicherverwaltungsoperatoren und ihrer Anwendung ist für den zweiten Teil des Artikels geplant, ...</p>
</blockquote>
<p>Das hätte mich sehr interessiert <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>Naja, vielleicht holt er es ja mit der Speicherverwaltung des Vektors nach. Wenn nicht gibt es haue <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713017</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 19 May 2009 21:03:20 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 21:21:15 GMT]]></title><description><![CDATA[<p>Uff hast du viel geschrieben... : D</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>außerdem muss man dann den ganzen template müll wieder beachten</p>
</blockquote>
<p>Wo ist hier der Unterschied zu dienem System? Was für einen Müll gibt es da speziell zu beachten, was es sonst nicht gäbe?</p>
</blockquote>
<p>Naja - sonst schreib ich einmal template und hab meine ganzen typedefs:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class list
{
  struct node : base_node
  {};
  struct iterator : iterator_base
  {};
//etc.
};
</code></pre>
<p>so muss ich aber jedes einzeln als template sehen und jedes mal wieder typedefs machen (bzw vom typedef-struct ableiten) und muss eben jedes ma nen einzelnes <code>template&lt;class T&gt;</code> davor schreiben...</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">/* ... */ friend /* ... */
</code></pre>
</blockquote>
<p>Wieso brauchst du ein <code>friend</code> in <code>iterator_base</code> ?</p>
</blockquote>
<p>Weil es nen private CTor gibt, der ein node_base* akzeptiert - der sollte nach außen natürlich nicht zugänglich sein (so sollte das ja auch üblich sein?!):</p>
<pre><code class="language-cpp">struct iterator : /*...*/
{
/*...*/
private:
	node *data;

	Titerator (node *_data = nullptr) : data(_data) {}
};
</code></pre>
<p>Dravere schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>z.bsp. braucht man ja &lt;algorithm&gt; für std::swap, den man da net includen kann, dann noch &lt;iterator&gt; für iteratoren für std::bidirectional_iterator_tag und hat beide ganz oben in list.h stehen, obwohl sie da net so wirklich hingehören...</p>
</blockquote>
<p>Keine Ahnung, was du damit ausdrücken willst. Wieso gehören sie dort nicht hin? Wieso in <strong>list.h</strong>? Du könntest sie ja auch auslagern zum File mit den Iteratoren. Was willst du hier aussagen? <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>
</blockquote>
<p>Naja - so kann ich es eben nicht in der <code>list_iterator.h</code> includen, weil ich dort nich nur im scope meines namespaces bin sondern vor allem in der class-definition von list... es ist ja bis jz so:</p>
<pre><code class="language-cpp">class list
{
 #include &quot;list_iterator.h&quot;
};
</code></pre>
<p>also kann ich iterator nicht in der <code>list_iterator.h</code> includen...<br />
das mit <code>#include &lt;algorithm&gt;</code> kannst du vergessen - das geht ja wieder, weil man swap ja eh außerhalb des eigenen namespaces spezialisiert...</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>ich könnte aber dort noch nen einfaches struct drum rum machen, damit ich das template zeugs net jedes ma aufs neue schreiben muss - oder was meinst du dazu?</p>
</blockquote>
<p>Was? Das Problem ist, dass du immer wieder <code>template&lt;typename T&gt;</code> hinschreiben musst? *ungläubisch schaut, dass jemand dies als Problem sehen kann* <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>
</blockquote>
<p>Naja - ich muss auch jedes ma wieder alle nötigen typedefs machen bzw von nem struct ableiten, was die beinhaltet - und es wäre eben wahrscheinlich auch nich so super elegant, jedes ma das selbe zu schreiben, also dacht ich an so was:</p>
<pre><code class="language-cpp">namespace detail
{
  template &lt;typename T&gt;
  struct list_stuff : typedefs::container &lt;T, std::size_t&gt;
  {
    struct node {/*...*/};

    struct iterator {/*...*/};
    struct const_iterator {/*...*/};
  };
}
</code></pre>
<p>Und hätte nicht jedes ma wieder bestimmte typedefs zu machen...<br />
Das könnte ich dann aber wieder nur komplett in eine Datei auslagern und nicht in list_node und list_iterator aufspalten... Aber naja - man könnte es wenigsten <code>list_stuff.h</code> nennen und man hätte es scho relativ gut getrennt - ich glaub, so werd ich es machen - oder was meinst du, ist es so ordentlicher/lesbarer/...?</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>PS: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: auch studium oder wieso vector implementieren? ^^</p>
</blockquote>
<p>Nein, er implementiert einen Vektor für seinen dritten Artikel, wo er WIEDER AUF BOOST::OPERATORS EINGEHT, STATT SEIN VERSPRECHEN AUS DEM ERSTEN ARTIKEL ZU HALTEN ... dort hat er nämlich gesagt, er würde im zweiten Artikel etwas über die Operatoren <code>new</code> und <code>new[]</code> sagen.<br />
-&gt;</p>
</blockquote>
<p>Ach stimmt ja - naja, hatte nich damit gerechnet, dass er die Artikel so schnell hintereinander macht - sehr vorbildlich : &gt;</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Eine umfassende Besprechung der Speicherverwaltungsoperatoren und ihrer Anwendung ist für den zweiten Teil des Artikels geplant, ...</p>
</blockquote>
<p>Das hätte mich sehr interessiert <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>
</blockquote>
<p>Mich auch - aber boost::operators ist eben auch nich gerade langweilig ^^ Gibts eben nen paar Artikel mehr von pumuckl!? <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=";D"
      alt="😉"
    /></p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713022</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 19 May 2009 21:21:15 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 21:52:22 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Wo ist hier der Unterschied zu dienem System? Was für einen Müll gibt es da speziell zu beachten, was es sonst nicht gäbe?</p>
</blockquote>
<p>Subklassen eines Klassentemplates sind implizit wieder Klassentemplates. Lagert man sie aus muss man sie zu expliziten Klassentemplates machen. Subklassen haben außerdem Zugriff auf die Interna der umgebenden Klasse, das kann nötig sein. Lagert man die Subklasse aus <em>kann</em> bei entsprechend starker Abhängigkeit ein friend vonnöten sein. IMO ist genau das das Entscheidungskriterium Subklasse vs. eigenständige Klasse: Ist es Kontextfrei, dann machs eigenständig. Ists eine starke Abhängigkeit von der umgebenden Klasse, lass es da.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>PS: <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: auch studium oder wieso vector implementieren? ^^</p>
</blockquote>
<p>Nein, mein Studium hab ich gottseidank letztes Jahr abgeschlossen (leider wars nichtmal Informatik). Ich hatte angefangen für meine Iteratorklasse (kommt im besagten dritten Artikel) eine Grundlage zu schaffen worauf sie iterieren kann - und erweitere es just for fun zu einem &quot;echten&quot; std::vector, zumindest vom Interface her.</p>
<p>Meine Anordnung der Klassen bisher:</p>
<pre><code class="language-cpp">//array_iterator.hpp /////////////////////////
namespace pumu {
  namespace util {

template &lt;class T&gt;
class array_iterator //...
}} //end namespace pumu::util

//memchunk.hpp /////////////////////////
namespace pumu {
  namespace memory {

template &lt;class T, class Allocator&gt;
struct MemChunk //...
}} //end namespace pumu::memory

//vector.hpp /////////////////////////
#include &quot;pumu/memory/memchunk.hpp&quot;
#include &quot;pumu/util/array_iterator.hpp&quot;

namespace pumu {
  namespace container {

template &lt;class T, class Allocator&gt;
class vector
{
  /*...*/
public:
  typedef typename pumu::util::array_iterator&lt;T&gt; iterator;
  /*...*/
private:
  MemChunk&lt;T, Allocator&gt; mem;

  struct ConstructGuard; //private Klasse, braucht Zugriff auf private Methoden.
};
</code></pre>
<p>Die Iteratorklasse ist von vornherein ls eigenständige Klasse konzipiert gewesen. Die MemChunk-Klasse war zuerst überhaupt nicht vorhanden, dann habe ich bei einem ersten Refactoring die Speicherverwaltung in eine private Subklasse ausgelagert, die aber eigenständig genug war, so dass sie als eigene Klasse ausgelagert werden konnte. Was ich hier schon skizziert habe ist der nächste Schritt: das Delegieren der Speicherbeschaffung an eine Allokatorklasse statt an operator new direkt - die Änderung erfordert keinerlei Änderungen an der vector-Klasse sondern nur an memchunk selber, ein weiteres Indiz dafür dass Memchunk als eingenständige Klasse bestehen sollte.</p>
<blockquote>
<p>Nein, er implementiert einen Vektor für seinen dritten Artikel, wo er WIEDER AUF BOOST::OPERATORS EINGEHT, STATT SEIN VERSPRECHEN AUS DEM ERSTEN ARTIKEL ZU HALTEN ... dort hat er nämlich gesagt, er würde im zweiten Artikel etwas über die Operatoren <code>new</code> und <code>new[]</code> sagen.<br />
-&gt;</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Eine umfassende Besprechung der Speicherverwaltungsoperatoren und ihrer Anwendung ist für den zweiten Teil des Artikels geplant, ...</p>
</blockquote>
<p>Das hätte mich sehr interessiert <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>Naja, vielleicht holt er es ja mit der Speicherverwaltung des Vektors nach. Wenn nicht gibt es haue <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>Grüssli</p>
</blockquote>
<p>&quot;Ist geplant&quot; heißt nicht versprochen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
die Planung hat sich seit Januar etwas verschoben, das stimmt. Und ja, Teil 3 geht wieder auf boost::operators ein, das war nciht geplant, aber ich musste den Artikel splitten weil er sonst zu lang geworden wäre. Operator new/delete sind auf jeden Fall noch geplant, in welchem Umfang und was alles behandelt wird weiß ich noch nicht. Die Speicherverwaltung des vector gibt da nicht viel her. Der vector selber macht nur placement-new und explizite Dtor-Aufrufe, die Speicherbeschaffung wird über den Memchunk an den Allocator delegiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713028</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 19 May 2009 21:52:22 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Tue, 19 May 2009 23:46:30 GMT]]></title><description><![CDATA[<p>@pumu':<br />
Auf deine ursprüngliche Frage:<br />
Ich würde *niemals* ein Header-File machen, welches *in* einer Klasse inkludiert werden muss.</p>
<p>#include hat gefälligst immer nur auf &quot;File-Scope&quot; zu stehen, also ausserhalb jeder Namespaces, Klassen und Funktionen.</p>
<p>Die einzige Ausnahme hier wären Headers die für Preprozessor-Magick verwendet werden. Wobei ich auch kein besonderer Freund von Preprozessor-Magick bin.</p>
<p>Wenn du deine Klasse auf mehrere Files aufteilen willst, dann ...<br />
a) verwende Klassen in Detail-Namespaces anstelle von nested Classes<br />
b) splitte Deklaration und Definition auf (das geht ja schliesslich auch bei Templates) - dann kannst du ganz leicht mehrere Files für die Definition verwenden wenn du unbedingt willst. Am ende des &quot;.hpp&quot; Files inkludierst du dann einfach alle &quot;.ipp&quot;/&quot;.imp&quot; Files (=die Files mit den Definitionen drinnen).</p>
<p>Oft ist IMO (a) die bessere Möglichkeit, da man dadurch die IMO hässliche Syntax für von der Deklaration getrennte Definitionen umgeht. Und oft kann man einige dieser Klassen dann für mehr als nur eine &quot;äussere&quot; Klasse einsetzen.</p>
<p>Oft verbietet man den Zugriff auf diese Detail Klassen dann auch nicht (wäre meist ziemlich viel &quot;friend&quot; Tippaufwand). Ist aber IMO kein Problem. Wer in seinem Code Fremde Detail-Klassen verwendet, ist des selberen schuld wenns mit der nächsten Version des Fremd-Codes nichtmehr geht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713057</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 19 May 2009 23:46:30 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 00:07:23 GMT]]></title><description><![CDATA[<p>War meine Frage, aber danke ^^</p>
<p>und ich werds trennen (in nen detail namespace)</p>
<p>ob ichs noch in deklaration und *.inl / <em>.impl (</em>.ipp und nur *.imp hab ich noch nie gesehen - aber das hat ja nix zu sagen ^^) trennen, weiß ich noch nicht genau - also selbst verständlich nur den code, der jz im &quot;main&quot;-file stehen geblieben ist - also der zu list... eigtl bin ich da bei templates nich so der fan von - bsp.:</p>
<pre><code class="language-cpp">void _erase(node *to_del, node_base *before, node_base *after)
{
	assert(to_del &amp;&amp; before &amp;&amp; after);
	assert( (to_del != &amp;m.anchor_begin) &amp;&amp; (to_del != &amp;m.anchor_end) );

	before-&gt;next = after;
	after-&gt;prev = before;
	delete to_del;
}
</code></pre>
<p>vs</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void list&lt;T&gt;::_erase(typename list&lt;T&gt;::node *to_del, typename list&lt;T&gt;::node_base *before, typename list&lt;T&gt;::node_base *after)
{
	assert(to_del &amp;&amp; before &amp;&amp; after);
	assert( (to_del != &amp;m.anchor_begin) &amp;&amp; (to_del != &amp;m.anchor_end) );

	before-&gt;next = after;
	after-&gt;prev = before;
	delete to_del;
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713060</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 20 May 2009 00:07:23 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 00:38:10 GMT]]></title><description><![CDATA[<blockquote>
<p>War meine Frage, aber danke ^^</p>
</blockquote>
<p>lol<br />
Hast du auch wieder Recht... <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>Und genau das meinte ich mit &quot;hässlicher Syntax&quot; <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>Deswegen bin ich in letzter Zeit auch dazu übergegangen, Klassen-Templates fast ausschliesslich implizit inline zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713063</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 20 May 2009 00:38:10 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 06:13:12 GMT]]></title><description><![CDATA[<p>Da bin ich mir beim vector noch unschlüssig. Das Ding hat ja eine ganze Menge Methoden, die Datei kommt am Ende sicherlich auf 700-1000 Zeilen. Bei so einer Menge finde ich eine möglichst kurze Klassendefinition (allein mit Methodendeklarationen und 2 Membervariablen schon 87 Zeilen) schon lang genug.</p>
<p>Ich bin am überlegen ob man die hässliche Syntax durch ein oder zwei Makros etwas aufpolieren könnte:</p>
<pre><code class="language-cpp">//alte Version:
template &lt;class T&gt;
typename vector&lt;T&gt;::iterator vector&lt;T&gt;::begin()
{
  return iterator(ptrbegin());
}

template &lt;class T&gt;
void vector&lt;T&gt;::resize(typename vector&lt;T&gt;::size_type sz, T c = T())
{
  if (sz &lt;= size()) return;
  reserve(sz);
  constructBackN(sz-size(), c);
}

//neue Version:
#define VEC_METHOD(type) \
template &lt;class T&gt; \
type vector&lt;T&gt;::

#define INNER_TYPE_METHOD(type) \
template &lt;class T&gt; \
typename vector&lt;T&gt;::##type vector&lt;T&gt;::

#define DEP_T(type) \
typename vector&lt;T&gt;::#type

INNER_TYPE_METHOD(iterator) begin()
{
  return iterator(ptrbegin());
}

VEC_METHOD(void) resize(DEP_T(size_type) sz, T c = T())
{
  if (sz &lt;= size()) return;
  reserve(sz);
  constructBackN(sz-size(), c);
}
</code></pre>
<p>so ganz glücklich bin ihc damit aber nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713095</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 20 May 2009 06:13:12 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 06:28:35 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
Also ich hasse solche Makros. Inbrünstig.<br />
Weil sie die Zeit die man braucht um den Code zu lesen (wenn man ihn noch nicht kennt) vervielfachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713101</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 20 May 2009 06:28:35 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 07:15:15 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>:<br />
Also ich hasse solche Makros. Inbrünstig.<br />
Weil sie die Zeit die man braucht um den Code zu lesen (wenn man ihn noch nicht kennt) vervielfachen.</p>
</blockquote>
<p>Wenns zu viele sind durchaus. Wie schon gesagt, glücklich war ich damit nicht.<br />
Mit einer 800-Zeilen Klasse wäre ich aber noch weniger glücklich, und die Syntax der externen definition ist halt hässlich....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713119</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 20 May 2009 07:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 08:51:50 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Deswegen bin ich in letzter Zeit auch dazu übergegangen, Klassen-Templates fast ausschliesslich implizit inline zu schreiben.</p>
</blockquote>
<p>Ich auch - aber wie pumuckl schon sagt... es ist nicht gerade übersichtlicher dadurch x)<br />
das makro find ich aber auch hässlich... es bringt dir eine zeile pro funktion - also vll 40 zeichen pro funktion - ich würd sie lieber mitschreiben, als mich dann durch makros wühlen zu müssen....</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713175</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 20 May 2009 08:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 12:46:58 GMT]]></title><description><![CDATA[<p>Darf ich da kurz nochmals nachfragen? Ihr findet sowas hässlich?</p>
<pre><code class="language-cpp">//////////////////////////////////////////////////////////////////////
// NamedObject

template&lt;typename T&gt;
class NamedObject
{
  // Typedefs //
public:
  typedef T Type;

  // Attributes //
public:
  Type m_object;
  std::string m_name;

  // Constructors //
public:
  NamedObject(std::string const&amp; name, Type const&amp; object);

  // Methods //
public:
  Type const&amp; get_object() const;
  std::string const&amp; get_name() const;
};

//////////////////////////////////////////////////////////////////////
// Templates implementation

//////////////////////////////////////////////////////////////////////
// NamedObject

/********************************************************************/
/* Constructors                                                     */
/********************************************************************/

template&lt;typename T&gt;
NamedObject&lt;T&gt;::NamedObject(std::string const&amp; name, Type const&amp; object)
  : m_name(name)
  , m_object(object)
{
}

/********************************************************************/
/* Methods                                                          */
/********************************************************************/

template&lt;typename T&gt;
T const&amp; NamedObject&lt;T&gt;::get_object() const
{
  return m_object;
}

/********************************************************************/

template&lt;typename T&gt;
std::string const&amp; NamedObject&lt;T&gt;::get_name() const
{
  return m_name;
}
</code></pre>
<p>Was genau mögt ihr daran nicht? Ich mag nämlich so eine Aufteilung. Gut wir reden hier jetzt über Geschmack, aber es würde mich interessieren, was genau ihr daran nicht mögt <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713298</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 20 May 2009 12:46:58 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 13:15:40 GMT]]></title><description><![CDATA[<p>Zwei Möglichkeiten: entweder die Klasse ist tatsächlich so kurz, dann sind die diversen Kommentare überflüssig - die Klasse wäre dann übersichtlich genug. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Oder die Klasse ist sehr viel länger, dann hätte man nicht vor drei sondern vor zig Methoden ein <code>template&lt;typename T&gt; NamedObject&lt;T&gt;::</code> usw. stehen - und die ständige Wiederholung ist halt auch nicht sehr schön.<br />
Vector hat mit Überladungen mal schlappe 40 Methoden, viele haben davon interne typedefs als Rückgabetyp und/oder Parameter, so dass da jedesmal noch ein <code>typename vector&lt;T, Allocator&gt;::iterator</code> oder ähnliches dazu muss - dann kommen noch die freien Vergleichsfunktionen dazu. Überschlagen sind das 60-80 mal <code>vector&lt;T,Allocator&gt;::</code> , 40x <code>template&lt;class T, class Allocator&gt;</code> , 20-40x <code>typename</code> - nervig!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713313</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 20 May 2009 13:15:40 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 13:21:44 GMT]]></title><description><![CDATA[<p>ich hatte doch oben scho nen Beispiel gemacht...</p>
<pre><code class="language-cpp">template &lt;typename T&gt; 
void list&lt;T&gt;::_erase(typename list&lt;T&gt;::node *to_del, typename list&lt;T&gt;::node_base *before, typename list&lt;T&gt;::node_base *after) 
{ 
    assert(to_del &amp;&amp; before &amp;&amp; after); 
    assert( (to_del != &amp;m.anchor_begin) &amp;&amp; (to_del != &amp;m.anchor_end) ); 

    before-&gt;next = after; 
    after-&gt;prev = before; 
    delete to_del; 
}
</code></pre>
<p>ist einfach hässlich -.-</p>
<p>vor allem, wenn ichs auch so machen könnte:</p>
<pre><code class="language-cpp">void _erase(node *to_del, node_base *before, node_base *after)
{
    assert(to_del &amp;&amp; before &amp;&amp; after);
    assert( (to_del != &amp;m.anchor_begin) &amp;&amp; (to_del != &amp;m.anchor_end) );

    before-&gt;next = after;
    after-&gt;prev = before;
    delete to_del;
}
</code></pre>
<p>meinste nicht auch? der nachteil liegt natürlich auch auf der hand:<br />
die klasse ist voll mit definitionen und so sind die deklarationen schwerer zu finden...<br />
naja - so, wie es jz aussieht, werd ich es zwar trennen, aber so ganz glücklich damit bin ich eben auch noch nicht... -.-</p>
<p>Man sieht ja schon hier:<br />
3x typename<br />
4x list&lt;T&gt;::<br />
1x template &lt;typename T&gt;</p>
<p>und das ist nur eine einzige Funktion... -.-</p>
<p>bb</p>
<p>PS: Hab gerad pumuckls Post gesehen(Vorschau) - genau das ist es eben - nervig und unschön - bei mir wäre es eben auch so in etwa...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713320</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 20 May 2009 13:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 13:29:03 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Zwei Möglichkeiten: entweder die Klasse ist tatsächlich so kurz, dann sind die diversen Kommentare überflüssig - die Klasse wäre dann übersichtlich genug. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
</blockquote>
<p>Ich bleibe bei der Darstellung der Klassen einheitlich, deshalb sind die Kommentare bei mir immer vorhanden, egal ob es eine grosse oder kleine Klasse ist <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>pumuckl schrieb:</p>
<blockquote>
<p>Überschlagen sind das 60-80 mal <code>vector&lt;T,Allocator&gt;::</code> , 40x <code>template&lt;class T, class Allocator&gt;</code> , 20-40x <code>typename</code> - nervig!</p>
</blockquote>
<p>Ach, es geht dir hier nur ums schreiben? Da sehe ich keine Probleme, da man sich hier ganz einfache Abhilfe über Copy&amp;Paste schaffen kann, weil es eben immer das gleiche ist. Sowas hat man in ca. einer Minute erledigt, auch bei 60-80 Methoden <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="😉"
    /><br />
1. Man kann die Deklaration der Funktionen kopieren und für die Definition verwenden.<br />
2. Vor die Funktionen muss jeweils zuerst ein <code>template&lt;...&gt;</code> und in einem zweiten Durchlauf ein <code>Class&lt;...&gt;::</code> . Maus &amp; &lt;Ctrl&gt; + &lt;V&gt; -&gt; zack, zack, zack <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="😉"
    /><br />
3. Zum Teil muss noch ein <code>typename Class&lt;...&gt;::</code> vor den Rückgabewert. Wieder Maus &amp; &lt;Ctrl&gt; + &lt;V&gt; -&gt; zack, zack, zack <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="😉"
    /><br />
4. Ich muss noch meine Kommentare einfügen. Die grobe Unterteilung der Bereiche ist einfach, da habe ich zusätzlich sogar noch Snippets.<br />
Für die Trennung der Methoden, ist es auch immer die gleiche Linie und noch eine neue Linie. Falls ein zusätzliche Abstand noch nicht vorhanden ist, füge ich per &lt;Enter&gt; noch eine ein. Wieder Copy&amp;Paste, dass geht wieder zack, zack, zack <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="😉"
    /><br />
5. Alle Semikolons durch eine neue Zeile und darunter '{' neue Zeile '}' ersetzen lassen. Das ist auch schnell erledigt.<br />
(Edit: 4. und 5. mache ich oft sogar zusammen und füge dann nur noch fehlende neue Zeilen per &lt;Enter&gt; ein ;))</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16305">@unskilled</a>,<br />
Die Funktionssignatur kannst du kürzen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; 
void list&lt;T&gt;::_erase(node *to_del, node_base *before, node_base *after)
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713324</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 20 May 2009 13:29:03 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 13:40:57 GMT]]></title><description><![CDATA[<p>Oo</p>
<p>Wusst ich noch gar nicht - auf die Idee wär ich auch nich gekommen ^^</p>
<p>Danke : &gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713330</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 20 May 2009 13:40:57 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 13:45:49 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>Wusst ich noch gar nicht - auf die Idee wär ich auch nich gekommen ^^</p>
</blockquote>
<p>Hmmm, vielleicht noch zur Erklärung, wieso das hier geht:<br />
Sobald du mit <code>list&lt;T&gt;::</code> gesagt hast, wo die Funktion liegt, ist der entsprechende Scope bekannt. Somit wird für die Suche nach den Typen auch der Scope der Klasse <code>list&lt;T&gt;</code> herangezogen.<br />
Das ist auch der Grund, wieso es nicht für den Rückgabetypen geht. Dort ist der Scope der Funktion noch nicht bekannt.<br />
Und das ist einer der Vorteile von C++0x, wo man den Rückgabetypen hinter die Funktionssignatur schreiben können wird, da dort wieder der Scope bekannt ist. In C++0x wird man somit nicht mal mehr beim Rückgabetypen <code>typename list&lt;T&gt;::</code> hinschreiben müssen <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713333</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713333</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 20 May 2009 13:45:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Wed, 20 May 2009 13:50:05 GMT]]></title><description><![CDATA[<p>Danke - fie Erklärung an sich hatte ich jz auch scho ergoogelt ^^</p>
<p>Das Feature des neuen Standards kannte ich noch gar nich - aber hab mich allgemein noch nich so sehr damit beschäfitgt - gibt auch so noch genug, was ich nich weiß <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=";D"
      alt="😉"
    /><br />
Aber danke noch mal : &gt;</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713336</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713336</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Wed, 20 May 2009 13:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Thu, 21 May 2009 00:47:24 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">template &lt;class GreenType, class ShadyBlueType&gt;
class FooBarBazQux
{
public:
	class State {};
	class LaliDo {};

	// lieber so ...
	static boost::shared_ptr&lt;State&gt; FiFaFunction(GreenType green, LaliDo lali);
};

// ... oder so?
template &lt;class GreenType, class ShadyBlueType&gt;
boost::shared_ptr&lt;typename FooBarBazQux&lt;GreenType, ShadyBlueType&gt;::State&gt; FooBarBazQux&lt;GreenType, ShadyBlueType&gt;::FiFaFunction(
        GreenType green,
        typename FooBarBazQux&lt;GreenType, ShadyBlueType&gt;::LaliDo lali)
{
}
</code></pre>
<p>Ich finde da doch eher die erste Variante &quot;besser&quot; <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/1713583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713583</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 21 May 2009 00:47:24 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Thu, 21 May 2009 10:10:22 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Ach, es geht dir hier nur ums schreiben?</p>
</blockquote>
<p>Nein, es geht NIE ums schreiben, sondern immer ums lesen. Und wenn der Code vollgemüllt ist mit <code>template&lt;...&gt;</code> , <code>Class&lt;...&gt;</code> und <code>typename Class&lt;...&gt;::</code> dann machts das Lesen deutlich schwerer.<br />
Ich denke dass die implizit-inline Version dann doch besser lesbar ist - und da man in den meisten IDEs inzwischen soetwas wie ein &quot;collapse all&quot; hat, ists auch nicht schwer, die ganzen Definitionen auf die Funktionssignaturen zu reduzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713660</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 21 May 2009 10:10:22 GMT</pubDate></item><item><title><![CDATA[Reply to Klassenteile in versch. Dateien aufspalten on Thu, 21 May 2009 10:32:18 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>,<br />
Dann könntest du aber das gleiche über die Trennung sagen, wenn es sich nicht um Templates handelt. Man hat auch überall ein <code>Class::</code> davor auch vor Rückgabetypen, welche aus der Klasse stammen. Das ganze wiederholt sich auch die gane Zeit und wenn man alles inline machen würde, könnte man mit der IDE durch &quot;collapse all&quot; auch ohne Probleme die reine Deklaration sehen. <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>Wenn du allgemein der Meinung bist, dass die Trennung unübersichtlich ist, dann versteh ich es zwar nicht, bzw. bin anderer Meinung, kann es aber unter Geschmacksache versorgen.<br />
Wenn du nur Trennung bei Templates als Problem siehst, dann wird in meinem Gehirn eine <code>std::logic_error</code> Exception geworfen <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>,<br />
Du hast unteranderem den gleichen Fehler gemacht, wie unskilled ihn bereits getan hat <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="😉"
    /><br />
Zudem kann man das durchaus auch noch ein wenig besser strukturieren.</p>
<pre><code class="language-cpp">template &lt;class GreenType, class ShadyBlueType&gt;
boost::shared_ptr
&lt;
  typename FooBarBazQux
  &lt;
    GreenType,
    ShadyBlueType
  &gt;::State
&gt;
FooBarBazQux&lt;GreenType, ShadyBlueType&gt;::FiFaFunction(GreenType green, LaliDo lali)
{
}
</code></pre>
<p>Und mit dem neuen Standard wäre es wohl so, oder? (kenne mich mit der Syntax noch nicht so genau aus:</p>
<pre><code class="language-cpp">template &lt;class GreenType, class ShadyBlueType&gt;
auto FooBarBazQux&lt;GreenType, ShadyBlueType&gt;::FiFaFunction(GreenType green, LaliDo lali)
  -&gt; boost::shared_ptr&lt;State&gt;
{
}
</code></pre>
<p>Und ja, ich ziehe sowas vor. Vor allem sind solche komplexe Ausdrücke, wie du einen hier präsentierst, eher selten anzutreffen. Und wenn sie vermehrt anzutreffen sind, dann kann man sie meistens durch ein simples <code>typedef</code> irgendwo oder einer kleinen Hilfstruktur wesentlich vereinfachen.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1713667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1713667</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 21 May 2009 10:32:18 GMT</pubDate></item></channel></rss>