<?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[Variablendeklaration]]></title><description><![CDATA[<p>Hallo,<br />
Wieder eine Grundsatzfrage, gegeben ist folgendes:</p>
<pre><code>class X{
public:
X(){ /*...*/ }
//...
}

class Y{
// ...
public:
Y(string sz){ /*...*/ }
void function(X*x){ /*...*/ }
}
</code></pre>
<p>Nun habe ich folgende main():</p>
<pre><code>int main(){
X x();
Y y(&quot;sdf&quot;);

Y.function(&amp;x); // geht nicht
}
</code></pre>
<p>Das geht nicht, der Fehler:</p>
<blockquote>
<p>error: no matching function for call to 'Read::readFile(DataSet (*)())'</p>
</blockquote>
<p>Es muss in main heissen:</p>
<pre><code>X x;
</code></pre>
<p>Nur warum? Was ist der Unterschied zwischen &quot;X x();&quot; und &quot;X x;&quot;, ich dachte bei beidem wird eine &quot;statische&quot; Variable deklariert? Anscheinend nicht?<br />
Und was stellt denn X(*) fuer eine Struktur dar? <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/170514/variablendeklaration</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 03:33:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170514.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Jan 2007 22:56:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variablendeklaration on Tue, 16 Jan 2007 22:56:04 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Wieder eine Grundsatzfrage, gegeben ist folgendes:</p>
<pre><code>class X{
public:
X(){ /*...*/ }
//...
}

class Y{
// ...
public:
Y(string sz){ /*...*/ }
void function(X*x){ /*...*/ }
}
</code></pre>
<p>Nun habe ich folgende main():</p>
<pre><code>int main(){
X x();
Y y(&quot;sdf&quot;);

Y.function(&amp;x); // geht nicht
}
</code></pre>
<p>Das geht nicht, der Fehler:</p>
<blockquote>
<p>error: no matching function for call to 'Read::readFile(DataSet (*)())'</p>
</blockquote>
<p>Es muss in main heissen:</p>
<pre><code>X x;
</code></pre>
<p>Nur warum? Was ist der Unterschied zwischen &quot;X x();&quot; und &quot;X x;&quot;, ich dachte bei beidem wird eine &quot;statische&quot; Variable deklariert? Anscheinend nicht?<br />
Und was stellt denn X(*) fuer eine Struktur dar? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1211055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211055</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Tue, 16 Jan 2007 22:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to Variablendeklaration on Tue, 16 Jan 2007 23:33:15 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Was ist der Unterschied zwischen &quot;X x();&quot; und &quot;X x;&quot;, ich dachte bei beidem wird eine &quot;statische&quot; Variable deklariert? Anscheinend nicht?</p>
</blockquote>
<p>Was ist das?</p>
<pre><code class="language-cpp">void x();
</code></pre>
<p>und wo ist dann hier der Unterschied</p>
<pre><code class="language-cpp">X x();
</code></pre>
<p>Leider ist die Grammatik der Sprache hier nicht eindeutig - diese Mehrdeutigkeit wird dahin aufgelöst, dass immer dann, wo es sich (auch) um eine Deklaration handeln könnte, das Konstrukt als Deklaration (hier einer Funktion) angenommen wird. Solange die Klammern nicht leer sind, kann man zwischen Funktionsdeklaration und Konstruktoraufrufen leicht unterscheiden. Im ersten Falle steht in den Klammern eine Liste von Typen (optional mit Bezeichnern), im zweiten Falle eine Liste von Ausdrücken. Bei den leeren Klammern ist das nicht der Fall. Überaschend - für den Anfänger - ist das ganze wohl deshalb, weil C++ keine lokalen Funktions<em>definitionen</em> erlaubt. Eine lokale Funktions<em>deklaration</em> dagegen sehr wohl (sie deklariert allerdings eine gewöhnliche Funktion, lediglich die deklarative Region ist stark beschränkt). Man kann annehmen, dass dieser Sprachteil anders funktionieren würde, wenn das Erbe von C nicht wäre.</p>
<p>Problematisch ist das Ganze im Allgemeinen nicht. Für nicht-PODs wird der Defaultkonstruktor ohnehin aufgerufen. Bei PODs kann man auf jeden Fall auf Copyinitialisierung ausweichen, ohne Effizienzeinbußen befürchten zu müssen (der Compiler, der das nicht optimiert, gehört wirklich auf den Müll).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211058</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 16 Jan 2007 23:33:15 GMT</pubDate></item><item><title><![CDATA[Reply to Variablendeklaration on Wed, 17 Jan 2007 00:21:16 GMT]]></title><description><![CDATA[<blockquote>
<p>Überaschend - für den Anfänger - ist das ganze wohl deshalb, weil C++ keine lokalen Funktionsdefinitionen erlaubt.</p>
</blockquote>
<p>Was meinst du...ich mach mir über den Satz einige Zeit Gedanken aber ich verstehe ihn nicht ganz. Ich kann in jeder Funktion eine andere Funktion definieren und aufrufen. Was soll dieser Satz bedeuten? Vielleicht ist meine Kritik fehl am Platz aber bitte befreit mich aus der Gedankenmühle über die Bedeutung dieses Satzes...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211066</guid><dc:creator><![CDATA[Crash_Override]]></dc:creator><pubDate>Wed, 17 Jan 2007 00:21:16 GMT</pubDate></item><item><title><![CDATA[Reply to Variablendeklaration on Wed, 17 Jan 2007 01:19:23 GMT]]></title><description><![CDATA[<p>Crash_Override schrieb:</p>
<blockquote>
<p>Ich kann in jeder Funktion eine andere Funktion definieren und aufrufen.</p>
</blockquote>
<p>Beispiel?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211072</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 17 Jan 2007 01:19:23 GMT</pubDate></item><item><title><![CDATA[Reply to Variablendeklaration on Wed, 17 Jan 2007 06:51:34 GMT]]></title><description><![CDATA[<p>Danke fuer die Antwort!</p>
<p>Wenn der Compiler das als Funktionsdeklaration liest ist das Verhalten schon irgendwie verstaendlich - nur was fuer einen Sinn sollte es haben eine Funktion innerhalb einer anderen lediglich zu _deklarieren_?? Ausserdem funktioniert ein Konstruktoraufruf mit dem anderen Konstruktor ja auch auf die gleiche Art und Weise (lediglich noch mit zusaetzlichem Parameter).</p>
<p>camper schrieb:</p>
<blockquote>
<p>Was ist das?</p>
<pre><code class="language-cpp">void x();
</code></pre>
<p>und wo ist dann hier der Unterschied</p>
<pre><code class="language-cpp">X x();
</code></pre>
<p>...<br />
(der Compiler, der das nicht optimiert, gehört wirklich auf den Müll).</p>
</blockquote>
<p>gcc (GCC) 4.1.2 20061028 (prerelease) (Debian 4.1.1-19)</p>
<p>Nja, vllt sollte ich da irgendein Flag setzen?! Mich hat es aber schon irgendwie gewundert, der Konstruktor sollte eigentlich schon erkannt werden, wenn es wirklich daran liegt. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211097</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211097</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Wed, 17 Jan 2007 06:51:34 GMT</pubDate></item><item><title><![CDATA[Reply to Variablendeklaration on Wed, 17 Jan 2007 07:03:37 GMT]]></title><description><![CDATA[<p>Fabeltier schrieb:</p>
<blockquote>
<p>Wenn der Compiler das als Funktionsdeklaration liest ist das Verhalten schon irgendwie verstaendlich - nur was fuer einen Sinn sollte es haben eine Funktion innerhalb einer anderen lediglich zu _deklarieren_??</p>
</blockquote>
<p>Wie gesagt wurde, ist das ein Erbe von C - und über den Sinn und Unsinn einer solchen Konstruktion lässt sich vortrefflich streiten.</p>
<blockquote>
<p>Ausserdem funktioniert ein Konstruktoraufruf mit dem anderen Konstruktor ja auch auf die gleiche Art und Weise (lediglich noch mit zusaetzlichem Parameter).</p>
</blockquote>
<p>Und genau dieser zusätzliche Parameter macht den Unterschied - dieses Konstrukt ist nämlich nicht mehr als Funktionsdeklaration anzusehen (woraus unmittelbar folgt, daß der Compiler es korrekt als Variablen-Deklaration mit Ctor-Aufruf interpretiert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211101</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 17 Jan 2007 07:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to Variablendeklaration on Wed, 17 Jan 2007 17:13:27 GMT]]></title><description><![CDATA[<p>Klingt logisch, eine Variable ist kein Typ - also kann ein Konstruktoraufruf mit einem Parameter keine Deklaration sein. Dass man den Defaultkonstruktor explizit nicht aufrufen darf, also mit Klammern, muss man sich wohl einfach mal merken (als Anfaenger <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>Danke fuer die Antworten!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1211535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1211535</guid><dc:creator><![CDATA[Fabeltier]]></dc:creator><pubDate>Wed, 17 Jan 2007 17:13:27 GMT</pubDate></item></channel></rss>