<?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[Abstrakte Klasse Ausgabe Operator überladen]]></title><description><![CDATA[<p>Guten Abend.<br />
Kann mir jemand erklären wie ich eine Operator Überladung mit einer abstrakten Klasse hinbekommen soll <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="😮"
    /> ? Nen Ausgabe Operator.</p>
<p>main.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &quot;menu.h&quot;
#include &quot;start menue.h&quot;

using namespace std;

int main()
{
    start_menue start;

// AM ENDE SOLL DAS  HIER MÖGLICH SEIN
// cout &lt;&lt; start;

    return 0;
}
</code></pre>
<p>menu.h</p>
<pre><code>#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED

#include &lt;iostream&gt;

using namespace std;

class menu{
public:
    menu(){cout &lt;&lt; &quot;Konstruktor  fuer abstrakte klasse&quot; &lt;&lt; endl;};
    virtual ~menu() { cout &lt;&lt; &quot;Destruktor fuer die abstrakte  klasse &quot; &lt;&lt; endl;};

    virtual void anzeigen() = 0;

      virtual void operator&lt;&lt;(ostream&amp;);

};

#endif // MENU_H_INCLUDED
</code></pre>
<p>start menue.h</p>
<pre><code>#ifndef START_MENUE_H_INCLUDED
#define START_MENUE_H_INCLUDED

#include &quot;menu.h&quot;
#include &lt;iostream&gt;
using namespace std;

class start_menue : public menu{
public:
    void anzeigen(){
        cout &lt;&lt; &quot;Start Menue&quot;;
    };

    start_menue() : menu() {cout &lt;&lt; &quot;Konstruktor fuer Startmenü&quot; &lt;&lt; endl;};

    ~start_menue(){cout &lt;&lt; &quot;Destruktor fuer Startmenü&quot; &lt;&lt; endl;};
    void operator&lt;&lt;(ostream&amp;){cout &lt;&lt; &quot;Penis&quot;;};

};
#endif // START_MENUE_H_INCLUDED
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/322787/abstrakte-klasse-ausgabe-operator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 16:35:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322787.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jan 2014 21:14:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Mon, 06 Jan 2014 21:14:23 GMT]]></title><description><![CDATA[<p>Guten Abend.<br />
Kann mir jemand erklären wie ich eine Operator Überladung mit einer abstrakten Klasse hinbekommen soll <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="😮"
    /> ? Nen Ausgabe Operator.</p>
<p>main.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &quot;menu.h&quot;
#include &quot;start menue.h&quot;

using namespace std;

int main()
{
    start_menue start;

// AM ENDE SOLL DAS  HIER MÖGLICH SEIN
// cout &lt;&lt; start;

    return 0;
}
</code></pre>
<p>menu.h</p>
<pre><code>#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED

#include &lt;iostream&gt;

using namespace std;

class menu{
public:
    menu(){cout &lt;&lt; &quot;Konstruktor  fuer abstrakte klasse&quot; &lt;&lt; endl;};
    virtual ~menu() { cout &lt;&lt; &quot;Destruktor fuer die abstrakte  klasse &quot; &lt;&lt; endl;};

    virtual void anzeigen() = 0;

      virtual void operator&lt;&lt;(ostream&amp;);

};

#endif // MENU_H_INCLUDED
</code></pre>
<p>start menue.h</p>
<pre><code>#ifndef START_MENUE_H_INCLUDED
#define START_MENUE_H_INCLUDED

#include &quot;menu.h&quot;
#include &lt;iostream&gt;
using namespace std;

class start_menue : public menu{
public:
    void anzeigen(){
        cout &lt;&lt; &quot;Start Menue&quot;;
    };

    start_menue() : menu() {cout &lt;&lt; &quot;Konstruktor fuer Startmenü&quot; &lt;&lt; endl;};

    ~start_menue(){cout &lt;&lt; &quot;Destruktor fuer Startmenü&quot; &lt;&lt; endl;};
    void operator&lt;&lt;(ostream&amp;){cout &lt;&lt; &quot;Penis&quot;;};

};
#endif // START_MENUE_H_INCLUDED
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2375670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375670</guid><dc:creator><![CDATA[Nivea342]]></dc:creator><pubDate>Mon, 06 Jan 2014 21:14:23 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Mon, 06 Jan 2014 21:20:17 GMT]]></title><description><![CDATA[<p>was geht denn nicht?</p>
<p>allgemein macht man die ostream-operatoren als freie funktionen und lässt sie auch denn ensprechenden stream zurückgeben damit man ausgaben verketten kann à la: <code>std::cout &lt;&lt; start &lt;&lt; '\n';</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375673</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 06 Jan 2014 21:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Mon, 06 Jan 2014 21:31:41 GMT]]></title><description><![CDATA[<p>So wie du es schreibst, hast du es genau verkehrt rum. Du hast einen Operator&lt;&lt;, der als linkes Argument ein Element deiner Klasse nimmt und als rechtes eine ostream&amp;. Also so:</p>
<pre><code>start_menu foo;
foo &lt;&lt; cout;
</code></pre>
<p>Um es umgekehrt zu machen, müsste die Funktion also entweder ein Member von ostream sein oder aber eine freie Funktion mit den Argumenten in passender Reihenfolge. Da du aber zur Klasse ostream nichts mehr hinzu fügen kannst, bleibt nur letztere Methode. Also freie Funktion:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp;, const deine_klasse&amp;);
</code></pre>
<p>Da man in solchen Operatoren oft auch auf private Daten der Klasse zugreifen möchte, wird so etwas häufig entweder mit einer public-Funktion zur Datenausgabe verknüpft (die dann vom Operator aufgerufen wird) oder man macht den Operator zu einem friend der Klasse. In dem Fall kann man den Operator auch inline in der Klassendefinition definieren:</p>
<pre><code>class foo
{
  friend ostream&amp; operator&lt;&lt;(ostream &amp;, const foo&amp;) { /* Hier Code */ }
};
</code></pre>
<p>Siehe unter anderem: <a href="http://www.c-plusplus.net/forum/232010" rel="nofollow">http://www.c-plusplus.net/forum/232010</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375676</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 06 Jan 2014 21:31:41 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Mon, 06 Jan 2014 21:31:57 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>was geht denn nicht?</p>
<p>allgemein macht man die ostream-operatoren als freie funktionen und lässt sie auch denn ensprechenden stream zurückgeben damit man ausgaben verketten kann à la: <code>std::cout &lt;&lt; start &lt;&lt; '\n';</code></p>
</blockquote>
<p>Ne ich will das ja als operator überladung haben. Einfach so zum spaß xD<br />
Ich poste mal die mir zumindests nichtssagenden Fehlermeldungen</p>
<p>Alles aus der menue.h<br />
Ich frag mich wie Menschen aus so was nur schlau werden xD</p>
<p>obj/Debug/main.o||In function <code>menu::menu()':| /home/cseipel/Code::Blocks Kram/GTK/test project/abstrakte klassen und vererbung/menu.h|10|undefined reference to</code>vtable for menu'|<br />
obj/Debug/main.o||In function <code>menu::~menu()':| /home/cseipel/Code::Blocks Kram/GTK/test project/abstrakte klassen und vererbung/menu.h|11|undefined reference to</code>vtable for menu'|<br />
obj/Debug/main.o:(.rodata._ZTI11start_menue[_ZTI11start_menue]+0x10)||undefined reference to `typeinfo for menu'|<br />
||=== Build finished: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|</p>
<p>obj/Debug/main.o||In function <code>menu::menu()':| /home/cseipel/Code::Blocks Kram/GTK/test project/abstrakte klassen und vererbung/menu.h|10|undefined reference to</code>vtable for menu'|<br />
obj/Debug/main.o||In function <code>menu::~menu()':| /home/cseipel/Code::Blocks Kram/GTK/test project/abstrakte klassen und vererbung/menu.h|11|undefined reference to</code>vtable for menu'|<br />
obj/Debug/main.o:(.rodata._ZTI11start_menue[_ZTI11start_menue]+0x10)||undefined reference to `typeinfo for menu'|<br />
||=== Build finished: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|</p>
<p>obj/Debug/main.o||In function <code>menu::menu()':| /home/cseipel/Code::Blocks Kram/GTK/test project/abstrakte klassen und vererbung/menu.h|10|undefined reference to</code>vtable for menu'|<br />
obj/Debug/main.o||In function <code>menu::~menu()':| /home/cseipel/Code::Blocks Kram/GTK/test project/abstrakte klassen und vererbung/menu.h|11|undefined reference to</code>vtable for menu'|<br />
obj/Debug/main.o:(.rodata._ZTI11start_menue[_ZTI11start_menue]+0x10)||undefined reference to `typeinfo for menu'|<br />
||=== Build finished: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375677</guid><dc:creator><![CDATA[Nivea342]]></dc:creator><pubDate>Mon, 06 Jan 2014 21:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Mon, 06 Jan 2014 21:40:16 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>So wie du es schreibst, hast du es genau verkehrt rum. Du hast einen Operator&lt;&lt;, der als linkes Argument ein Element deiner Klasse nimmt und als rechtes eine ostream&amp;. Also so:</p>
<pre><code>start_menu foo;
foo &lt;&lt; cout;
</code></pre>
<p>Um es umgekehrt zu machen, müsste die Funktion also entweder ein Member von ostream sein oder aber eine freie Funktion mit den Argumenten in passender Reihenfolge. Da du aber zur Klasse ostream nichts mehr hinzu fügen kannst, bleibt nur letztere Methode. Also freie Funktion:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp;, const deine_klasse&amp;);
</code></pre>
<p>Da man in solchen Operatoren oft auch auf private Daten der Klasse zugreifen möchte, wird so etwas häufig entweder mit einer public-Funktion zur Datenausgabe verknüpft (die dann vom Operator aufgerufen wird) oder man macht den Operator zu einem friend der Klasse. In dem Fall kann man den Operator auch inline in der Klassendefinition definieren:</p>
<pre><code>class foo
{
  friend ostream&amp; operator&lt;&lt;(ostream &amp;, const foo&amp;) { /* Hier Code */ }
};
</code></pre>
<p>Siehe unter anderem: <a href="http://www.c-plusplus.net/forum/232010" rel="nofollow">http://www.c-plusplus.net/forum/232010</a></p>
</blockquote>
<p>Für abstrakte Klassen gibt es leider kein Friend <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Mir gelingt es auch so leider nicht.</p>
<p>main.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &quot;menu.h&quot;
#include &quot;start menue.h&quot;

using namespace std;

int main()
{
    start_menue foo;
    cout &lt;&lt; foo;

    return 0;
}
</code></pre>
<p>menue.h</p>
<pre><code>#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED

#include &lt;iostream&gt;

using namespace std;

class menu{
public:
    menu(){cout &lt;&lt; &quot;Konstruktor  fuer abstrakte klasse&quot; &lt;&lt; endl;};
    virtual ~menu() { cout &lt;&lt; &quot;Destruktor fuer die abstrakte  klasse &quot; &lt;&lt; endl;};

    virtual void anzeigen() = 0;

     virtual ostream&amp; operator&lt;&lt;(ostream&amp;, const menu&amp;);

};

#endif // MENU_H_INCLUDED
</code></pre>
<p>start_menu.h</p>
<pre><code>#ifndef START_MENUE_H_INCLUDED
#define START_MENUE_H_INCLUDED

#include &quot;menu.h&quot;
#include &lt;iostream&gt;
using namespace std;

class start_menue : public menu{
public:
    void anzeigen(){
        cout &lt;&lt; &quot;Start Menue&quot;;
    };

    start_menue() : menu() {cout &lt;&lt; &quot;Konstruktor fuer Startmenü&quot; &lt;&lt; endl;};

    ~start_menue(){cout &lt;&lt; &quot;Destruktor fuer Startmenü&quot; &lt;&lt; endl;};

    ostream&amp; operator&lt;&lt;(ostream&amp;, const menu&amp;){
        cout &lt;&lt; &quot;test&quot;;
    }

};
#endif // START_MENUE_H_INCLUDED
</code></pre>
<p>Mal ganz abgesehn davon das start_menue.h sowieso vermutlich wegen</p>
<blockquote>
<p>const menu&amp;</p>
</blockquote>
<p>nicht geht bei</p>
<blockquote>
<p>ostream&amp; operator&lt;&lt;(ostream&amp;, const menu&amp;){<br />
cout &lt;&lt; &quot;test&quot;;<br />
}</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2375678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375678</guid><dc:creator><![CDATA[Nivea342]]></dc:creator><pubDate>Mon, 06 Jan 2014 21:40:16 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Tue, 07 Jan 2014 04:34:40 GMT]]></title><description><![CDATA[<p>@Nivea342<br />
Du kannst den &quot;Ausgabe Operator&quot; nicht als Memberfunktion implementieren. Geht einfach nicht.<br />
Daher kann man ihn auch nicht überschreiben.</p>
<p>Was du machen kannst, ist einen &quot;Ausgabe Operator&quot; für die Basisklasse als Funktion zu definieren, die dann einfach nur eine normale Memberfunktion aufruft.<br />
Diese Memberfunktion kann dann virtual sein, und in abgeleiteten Klassen überschrieben werden:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class menu
{
public:
    menu() { cout &lt;&lt; &quot;Konstruktor fuer abstrakte klasse&quot; &lt;&lt; endl; }
    virtual ~menu() { cout &lt;&lt; &quot;Destruktor fuer die abstrakte klasse &quot; &lt;&lt; endl; }

    virtual void anzeigen() = 0;
    virtual void ausgabe_in_stream(ostream&amp; stream) const = 0;
 };

ostream&amp; operator &lt;&lt; (ostream&amp; stream, const menu&amp; m)
{
	m.ausgabe_in_stream(stream);
	return stream;
}

class start_menue : public menu
{
public:
	virtual void anzeigen() { cout &lt;&lt; &quot;Start Menue&quot; &lt;&lt; endl; }

	~start_menue() { cout &lt;&lt; &quot;Destruktor fuer Startmenü&quot; &lt;&lt; endl; }

	virtual void ausgabe_in_stream(ostream&amp; stream) const
	{
		stream &lt;&lt; &quot;stream &lt;&lt; start_menue&quot; &lt;&lt; endl;
	} 
};

class anderes_menue : public menu
{
public:
	virtual void anzeigen() { cout &lt;&lt; &quot;Anderes Menue&quot; &lt;&lt; endl; }

	~anderes_menue() { cout &lt;&lt; &quot;Destruktor fuer anderes Menü&quot; &lt;&lt; endl; }

	virtual void ausgabe_in_stream(ostream&amp; stream) const
	{
		stream &lt;&lt; &quot;stream &lt;&lt; anderes_menue&quot; &lt;&lt; endl;
	} 
};

int main()
{
	start_menue start;
 	cout &lt;&lt; start;

	anderes_menue a;
	cout &lt;&lt; a;

	return 0;
}
</code></pre>
<p>EDIT: <code>ausgabe_in_stream: cout &lt;&lt; &quot;...&quot; -&gt; stream &lt;&lt; &quot;...&quot;</code></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375679</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Jan 2014 04:34:40 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Mon, 06 Jan 2014 22:19:37 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>@Nivea342<br />
Du kannst den &quot;Ausgabe Operator&quot; nicht als Memberfunktion implementieren. Geht einfach nicht.<br />
Daher kann man ihn auch nicht überschreiben.</p>
<p>Was du machen kannst, ist einen &quot;Ausgabe Operator&quot; für die Basisklasse als Funktion zu definieren, die dann einfach nur eine normale Memberfunktion aufruft.<br />
Diese Memberfunktion kann dann virtual sein, und in abgeleiteten Klassen überschrieben werden:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class menu
{
public:
    menu() { cout &lt;&lt; &quot;Konstruktor fuer abstrakte klasse&quot; &lt;&lt; endl; }
    virtual ~menu() { cout &lt;&lt; &quot;Destruktor fuer die abstrakte klasse &quot; &lt;&lt; endl; }
 
    virtual void anzeigen() = 0;
    virtual void ausgabe_in_stream(ostream&amp; stream) const = 0;
 };

ostream&amp; operator &lt;&lt; (ostream&amp; stream, const menu&amp; m)
{
	m.ausgabe_in_stream(stream);
	return stream;
}

class start_menue : public menu
{
public:
	virtual void anzeigen() { cout &lt;&lt; &quot;Start Menue&quot; &lt;&lt; endl; }
  
	~start_menue() { cout &lt;&lt; &quot;Destruktor fuer Startmenü&quot; &lt;&lt; endl; }

	virtual void ausgabe_in_stream(ostream&amp; stream) const
	{
		cout &lt;&lt; &quot;cout &lt;&lt; start_menue&quot; &lt;&lt; endl;
	} 
};

class anderes_menue : public menu
{
public:
	virtual void anzeigen() { cout &lt;&lt; &quot;Anderes Menue&quot; &lt;&lt; endl; }
  
	~anderes_menue() { cout &lt;&lt; &quot;Destruktor fuer anderes Menü&quot; &lt;&lt; endl; }

	virtual void ausgabe_in_stream(ostream&amp; stream) const
	{
		cout &lt;&lt; &quot;cout &lt;&lt; anderes_menue&quot; &lt;&lt; endl;
	} 
};

int main()
{
	start_menue start;
 	cout &lt;&lt; start;

	anderes_menue a;
	cout &lt;&lt; a;

	return 0;
}
</code></pre>
</blockquote>
<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Wieder was neues gelernt ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375681</guid><dc:creator><![CDATA[Nivea342]]></dc:creator><pubDate>Mon, 06 Jan 2014 22:19:37 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Tue, 07 Jan 2014 18:42:38 GMT]]></title><description><![CDATA[<pre><code>virtual void ausgabe_in_stream(ostream&amp; stream) const
	{
		stream &lt;&lt; &quot;cout &lt;&lt; anderes_menue&quot; &lt;&lt; endl;
	}
</code></pre>
<p>An der Stelle <code>stream</code> , anstatt <code>cout</code> verwenden! Das kann sonst später ganz schön mächtig in die Hose gehen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375873</guid><dc:creator><![CDATA[Die erinnerung]]></dc:creator><pubDate>Tue, 07 Jan 2014 18:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Abstrakte Klasse Ausgabe Operator überladen on Tue, 07 Jan 2014 21:51:33 GMT]]></title><description><![CDATA[<p>Richtig.</p>
<p>Hatte ich Copy+Paste übernommen und erst später korrigiert. Nivea342 hat's leider zu schnell zitiert, da war mein EDIT noch nicht drinnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2375924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2375924</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 07 Jan 2014 21:51:33 GMT</pubDate></item></channel></rss>