<?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[Der Ausdruck muss einen Klassentyp aufweisen]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich bin neu in C++ und will ein einfaches OOP-Programm schreiben:</p>
<pre><code class="language-cpp">#include &quot;Allgemein.h&quot;

class Tier
{
private:
	int alter;
public:
	Tier(void);
	//~Tier(void);

	int getAlter();
};

Tier::Tier()
{
	alter = 0;
}

int Tier::getAlter()
{
	return alter;
}

int main(void)
{
	Tier elefant();

	cout &lt;&lt; elefant.getAlter() &lt;&lt; endl;

	getchar();
	return 0;
}
</code></pre>
<p>bei elefant.getAlter() spuckt mir der Compiler aber die im Betreff genannte Fehlermeldung aus.</p>
<p>Wo ist denn der Fehler. Ich verstehs nicht... <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/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Danke für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/303384/der-ausdruck-muss-einen-klassentyp-aufweisen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 10 Aug 2026 11:11:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/303384.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 12 May 2012 13:28:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 13:28:13 GMT]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich bin neu in C++ und will ein einfaches OOP-Programm schreiben:</p>
<pre><code class="language-cpp">#include &quot;Allgemein.h&quot;

class Tier
{
private:
	int alter;
public:
	Tier(void);
	//~Tier(void);

	int getAlter();
};

Tier::Tier()
{
	alter = 0;
}

int Tier::getAlter()
{
	return alter;
}

int main(void)
{
	Tier elefant();

	cout &lt;&lt; elefant.getAlter() &lt;&lt; endl;

	getchar();
	return 0;
}
</code></pre>
<p>bei elefant.getAlter() spuckt mir der Compiler aber die im Betreff genannte Fehlermeldung aus.</p>
<p>Wo ist denn der Fehler. Ich verstehs nicht... <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/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Danke für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210826</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Sat, 12 May 2012 13:28:13 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 13:30:57 GMT]]></title><description><![CDATA[<p>Zeile 27 deklariert eine Funktion. Mach die Klammern weg. <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 />
Edit:<br />
Und (void) braucht man in C++ nicht mehr, einfach () schreiben.<br />
Und leere Konstruktoren/Destruktoren bringen nicht so viel.<br />
Und Initialisierungsliste solltest du mal googeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210827</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sat, 12 May 2012 13:30:57 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 13:31:26 GMT]]></title><description><![CDATA[<p>blub85 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Tier elefant();
</code></pre>
</blockquote>
<p>Du erzeugst damit keine Instanz, sondern deklarierst eine Funktion. Sprich, lass die Klammern <code>()</code> weg.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210829</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 13:31:26 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 13:43:27 GMT]]></title><description><![CDATA[<p>Danke für die Hilfe!!</p>
<p>Hätte ich allerdings Parameter in meinem Konstruktor, dann brauch ich ja die Klammern, oder?</p>
<p>Daher dachte ich, wenn ich keine Parameter habe, dann mache ich leere Klammern... <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>Und wo wir grad bie Konstruktoren sind... Worin liegt denn der Unterschied zu meiner Variante oben und einer à la:</p>
<p>Tier elefant = new Tier()</p>
<p>Vielen Dank!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210836</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Sat, 12 May 2012 13:43:27 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 13:51:46 GMT]]></title><description><![CDATA[<p>blub85 schrieb:</p>
<blockquote>
<p>Hätte ich allerdings Parameter in meinem Konstruktor, dann brauch ich ja die Klammern, oder?</p>
</blockquote>
<p>Richtig.</p>
<p>blub85 schrieb:</p>
<blockquote>
<p>Daher dachte ich, wenn ich keine Parameter habe, dann mache ich leere Klammern... <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>
</blockquote>
<p>Tja, falsch gedacht. :p</p>
<p>blub85 schrieb:</p>
<blockquote>
<p>Worin liegt denn der Unterschied zu meiner Variante oben und einer à la:<br />
Tier elefant = new Tier()</p>
</blockquote>
<p>Hier wird eine Instanz im Freispeicher (Heap) abgelegt. Das ist dann manuelle Speicherverwaltung, und du musst das, was du mit <code>new</code> anforderst, wieder mit <code>delete</code> freigeben, ansonsten hast du ein Speicherleckt. (so sollte man es nicht machen)<br />
Bei der anderen Variante wird die Instanz auf dem Stack abgelegt. Der angeforderte Speicherplatz wird automatisch wieder freigegeben, da RAII. (so wird's gemacht)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210839</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 13:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 14:12:04 GMT]]></title><description><![CDATA[<p>Alles klar.. Vielen Dank!</p>
<p>Worin liegt denn der Unterschied zw.</p>
<p>Objekt.Methode() und Objekt-&gt;Methode() ?</p>
<p>Das hängt doch mit dem oben genannten zusammen oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210844</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Sat, 12 May 2012 14:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 15:23:38 GMT]]></title><description><![CDATA[<p>blub85 schrieb:</p>
<blockquote>
<p>Worin liegt denn der Unterschied zw.</p>
<p>Objekt.Methode() und Objekt-&gt;Methode() ?</p>
</blockquote>
<p>Um es ganz grob zu sagen:</p>
<p>Wenn du mit einem Zeiger auf Member einer Klasse zugreifen willst, funktioniert nicht der punkt-Operator (da es ja keine Referenz ist sondern ein Zeiger).</p>
<p>Das bedeutet, du musst zuerst den Zeiger dereferenzieren, bevor du auf Member zugreifen kannst. Nun funktioniert aber folgendes nicht:</p>
<pre><code class="language-cpp">*Zeiger.Funktion();
</code></pre>
<p>Denn der Punkt-Operator wird zuerst ausgewertet. Also müsstest du die Dereferenzierung in Klammern setzen:</p>
<pre><code class="language-cpp">(*Zeiger).Funktion();
</code></pre>
<p>Was sehr hässlich ist. Also, statt obiges zu schreiben, hat man das eingeführt:</p>
<pre><code class="language-cpp">Zeiger-&gt;Funktion();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2210860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210860</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 15:23:38 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 15:49:28 GMT]]></title><description><![CDATA[<p>Ah okay.. Super, ist super hilfreich für mich, was ihr hier grad alles postet...! Danke!</p>
<p>Zwei Fragen hab ich gerade noch im Kopf:</p>
<p>1. angenommen ich hab ne Klasse foo und erstelle mir ein Objekt davon, gibt es ja zwei Möglichkeiten:</p>
<pre><code class="language-cpp">Foo fooInstanz1;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">Foo fooInstanz2 = new Foo();
</code></pre>
<p>Mit Stack und Heap haben wir ja vorhin schon gehabt.</p>
<p>fooInstanz1 und fooInstanz2 sind aber jeweils Refernzen auf das Objekt, oder? Keine Zeiger o.Ä.</p>
<p>und 2.<br />
Operatorüberladung. Hab ich soweit kapiert. Aber warum arbeite ich mit hierbei immer mit dem Referenzierungsoperator (in den Parametern)? Egal welche Beispiele ich mir hierzu anschaue, immer kommt der Operator vor, z.B.:</p>
<pre><code class="language-cpp">Foo Foo::operator&amp;(const Foo&amp; a)
{
...
}
</code></pre>
<p>Danke!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210866</guid><dc:creator><![CDATA[blub85]]></dc:creator><pubDate>Sat, 12 May 2012 15:49:28 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 16:16:48 GMT]]></title><description><![CDATA[<p>blub85 schrieb:</p>
<blockquote>
<p>1. angenommen ich hab ne Klasse foo und erstelle mir ein Objekt davon, gibt es ja zwei Möglichkeiten:</p>
<pre><code class="language-cpp">Foo fooInstanz1;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">Foo fooInstanz2 = new Foo();
</code></pre>
</blockquote>
<p>Nein. Das erste ist richtig, das zweite ist falsch. Frag einfach mal deinen Compiler.</p>
<p>blub85 schrieb:</p>
<blockquote>
<p>und 2.<br />
Operatorüberladung. Hab ich soweit kapiert. Aber warum arbeite ich mit hierbei immer mit dem Referenzierungsoperator (in den Parametern)? Egal welche Beispiele ich mir hierzu anschaue, immer kommt der Operator vor, z.B.:</p>
<pre><code class="language-cpp">Foo Foo::operator&amp;(const Foo&amp; a)
{
...
}
</code></pre>
</blockquote>
<p>In deinem Beispiel dient es lediglich dazu, dir eine (potentiell teure) Kopie zu sparen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210882</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 12 May 2012 16:16:48 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 16:59:07 GMT]]></title><description><![CDATA[<p>blub85 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Foo fooInstanz2 = new Foo();
</code></pre>
</blockquote>
<p>Das ginge nur, wenn es einen Konstruktor von Foo gäbe, der (nur!) einen Zeiger auf Foo nimmt. Sonst müsste entweder <code>fooInstanz2</code> ein Zeiger sein, oder der RValue <code>new Foo</code> dereferenziert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210890</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 16:59:07 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 16:34:35 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Du kannst auch z. B. Copy&amp;Swap benutzen.</p>
</blockquote>
<p>Was hat denn Copy&amp;Swap mit <code>Foo Foo::operator&amp;(const Foo&amp;)</code> zu tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210893</guid><dc:creator><![CDATA[Caligulaminus]]></dc:creator><pubDate>Sat, 12 May 2012 16:34:35 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 16:58:54 GMT]]></title><description><![CDATA[<p>Caligulaminus schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Du kannst auch z. B. Copy&amp;Swap benutzen.</p>
</blockquote>
<p>Was hat denn Copy&amp;Swap mit <code>Foo Foo::operator&amp;(const Foo&amp;)</code> zu tun?</p>
</blockquote>
<p>Ouh, ich dachte da steht <code>operator=(...</code> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2210898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210898</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 16:58:54 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 17:37:19 GMT]]></title><description><![CDATA[<p>blub85 schrieb:</p>
<blockquote>
<p>fooInstanz1 und fooInstanz2 sind aber jeweils Refernzen auf das Objekt, oder? Keine Zeiger o.Ä.</p>
</blockquote>
<p>Nein. <code>fooInstanz1</code> ist eine Instanz vom Typ <code>Foo</code> . Und zweiteres geht so nicht, weil <code>new</code> einen Zeiger auf den angeforderten Speicherbereich zurückgibt, sprich, du brauchst für Variante 2 einen Zeiger.</p>
<p>blub85 schrieb:</p>
<blockquote>
<p>Aber warum arbeite ich mit hierbei immer mit dem Referenzierungsoperator (in den Parametern)?</p>
</blockquote>
<p><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="😕"
    /> Den Adressoperator zu überladen macht nur wenig Sinn, außer du willst verbieten, dass ein Zeiger auf eine Instanz deiner Klasse zeigen kann... und selbst das macht doch nur wenig Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210911</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 17:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 18:01:31 GMT]]></title><description><![CDATA[<p>Gugelmoser schrieb:</p>
<blockquote>
<p>blub85 schrieb:</p>
<blockquote>
<p>fooInstanz1 und fooInstanz2 sind aber jeweils Refernzen auf das Objekt, oder? Keine Zeiger o.Ä.</p>
</blockquote>
<p>Nein. <code>fooInstanz1</code> ist eine Instanz vom Typ <code>Foo</code> . Und zweiteres geht so nicht, weil <code>new</code> einen Zeiger auf den angeforderten Speicherbereich zurückgibt, sprich, du brauchst für Variante 2 einen Zeiger.</p>
<p>blub85 schrieb:</p>
<blockquote>
<p>Aber warum arbeite ich mit hierbei immer mit dem Referenzierungsoperator (in den Parametern)?</p>
</blockquote>
<p><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="😕"
    /> Den Adressoperator zu überladen macht nur wenig Sinn, außer du willst verbieten, dass ein Zeiger auf eine Instanz deiner Klasse zeigen kann... und selbst das macht doch nur wenig Sinn.</p>
</blockquote>
<p>Design-Regel: Es gibt Operatoren, die man nicht überladen sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210923</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 12 May 2012 18:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to Der Ausdruck muss einen Klassentyp aufweisen on Sat, 12 May 2012 21:02:51 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Design-Regel: Es gibt Operatoren, die man nicht überladen sollte.</p>
</blockquote>
<p>Designregel gebrochen: PI schreibt eine Lambda-Lib, in der &amp;_0 ein gültiger Lambda-Ausdruck ist. Deal with it.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2210956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2210956</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sat, 12 May 2012 21:02:51 GMT</pubDate></item></channel></rss>