<?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[Konstruktor mit Klammern aufrufen]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich bin auf ein Problem gestoßen bei dem ich etwas irritiert bin, dass mir das noch nie begegnet ist.<br />
Und zwar habe ich eine einfache Klasse geschrieben:</p>
<pre><code>class Hallo
{
    static int count;
    int bla;
    public:
    Hallo(){ count++; std::cout &lt;&lt; &quot;Init\n&quot; &lt;&lt; std::endl;}
    ~Hallo(){ count--;}
    int getBla();
};
</code></pre>
<p>um mit statischen Membern ein bisschen rumzuspielen. Aber dann habe ich ein Objekt dieser Klasse angelegt:</p>
<pre><code>Hallo foo();
foo.getBla();
</code></pre>
<p>und bekomme die Fehlermeldung:</p>
<blockquote>
<p>error: request for member ‘getBla’ in ‘foo’, which is of non-class type ‘Hallo()’</p>
</blockquote>
<p>Nehme ich den Konstruktor aber ohne die Klammern funktioniert es. Oder wenn ich das Objekt mit Hallo foo = Hallo() anlege auch.</p>
<p>Gibt es da irgendwo eine Regel wann ich den selbst-definierten Default-Konstruktor mit und wann ohne Klammern aufrufen soll und wann mit...?</p>
<p>Vielen Dank für Eure Antwort.</p>
<p>/C</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328217/konstruktor-mit-klammern-aufrufen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Jul 2026 06:54:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328217.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 28 Sep 2014 19:34:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 19:34:17 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich bin auf ein Problem gestoßen bei dem ich etwas irritiert bin, dass mir das noch nie begegnet ist.<br />
Und zwar habe ich eine einfache Klasse geschrieben:</p>
<pre><code>class Hallo
{
    static int count;
    int bla;
    public:
    Hallo(){ count++; std::cout &lt;&lt; &quot;Init\n&quot; &lt;&lt; std::endl;}
    ~Hallo(){ count--;}
    int getBla();
};
</code></pre>
<p>um mit statischen Membern ein bisschen rumzuspielen. Aber dann habe ich ein Objekt dieser Klasse angelegt:</p>
<pre><code>Hallo foo();
foo.getBla();
</code></pre>
<p>und bekomme die Fehlermeldung:</p>
<blockquote>
<p>error: request for member ‘getBla’ in ‘foo’, which is of non-class type ‘Hallo()’</p>
</blockquote>
<p>Nehme ich den Konstruktor aber ohne die Klammern funktioniert es. Oder wenn ich das Objekt mit Hallo foo = Hallo() anlege auch.</p>
<p>Gibt es da irgendwo eine Regel wann ich den selbst-definierten Default-Konstruktor mit und wann ohne Klammern aufrufen soll und wann mit...?</p>
<p>Vielen Dank für Eure Antwort.</p>
<p>/C</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419754</guid><dc:creator><![CDATA[columbus]]></dc:creator><pubDate>Sun, 28 Sep 2014 19:34:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 19:38:56 GMT]]></title><description><![CDATA[<pre><code>Hallo foo();
</code></pre>
<p>Das deklariert eine Funktion mit Namen foo, die ein Objekt vom Typ Hallo zurückliefert.</p>
<pre><code>Hallo foo;
</code></pre>
<p>Erzeugt ein Objekt foo.</p>
<pre><code>struct bar{...};
Hallo foo(bar());
</code></pre>
<p>Deklariert eine Funktion mit Namen foo, die als Parameter ein Objekt vom Typ bar erhält und ein Objekt vom Typ Hallo zurückliefert.</p>
<pre><code>Hallo foo{};
</code></pre>
<p>Erzeugt ein Objekt foo (C++11).</p>
<pre><code>Hallo foo{bar()};
</code></pre>
<p>Erzeugt ein Objekt foo, initialisiert mit einem default-konstruierten Objekt vom Typ bar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419756</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 28 Sep 2014 19:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 19:45:10 GMT]]></title><description><![CDATA[<pre><code>Hallo foo();
</code></pre>
<p>Diese Deklaration deklariert eine <strong>Funktion</strong> (die keine Parameter hat und <code>Hallo</code> zurückgibt), keine Variable. Der Fehler nennt sich <a href="http://en.wikipedia.org/wiki/Most_vexing_parse" rel="nofollow">most vexing parse</a>.</p>
<blockquote>
<p>Deklariert eine Funktion mit Namen foo, die als Parameter ein Objekt vom Typ bar erhält und ein Objekt vom Typ Hallo zurückliefert.</p>
</blockquote>
<p>Nein. Es deklariert eine Funktion die als Parameter einen Funktionszeiger auf eine Funktion ohne Parameter und <code>bar</code> als Rückgabetyp nimmt (Test <a href="http://coliru.stacked-crooked.com/a/221a42d4a21851be" rel="nofollow">hier</a>).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419757</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 28 Sep 2014 19:45:10 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 19:46:54 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Deklariert eine Funktion mit Namen foo, die als Parameter ein Objekt vom Typ bar erhält und ein Objekt vom Typ Hallo zurückliefert.</p>
</blockquote>
<p>Nein. Es deklariert eine Funktion die als Parameter einen Funktionszeiger auf eine Funktion ohne Parameter und <code>bar</code> als Rückgabetyp nimmt (Test <a href="http://coliru.stacked-crooked.com/a/221a42d4a21851be" rel="nofollow">hier</a>).</p>
</blockquote>
<p>Jup, du hast Recht.<br />
Auf jeden Fall eine Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419759</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419759</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 28 Sep 2014 19:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 19:48:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Auf jeden Fall eine Funktion.</p>
</blockquote>
<p><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/2419760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419760</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 28 Sep 2014 19:48:55 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 19:51:51 GMT]]></title><description><![CDATA[<p>Hmmm, diese Funktionen: Hallo foo(); habe ich aber in main aufgerufen.<br />
gebe das zu bedenken.</p>
<p>/C</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419762</guid><dc:creator><![CDATA[columbus]]></dc:creator><pubDate>Sun, 28 Sep 2014 19:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 20:02:48 GMT]]></title><description><![CDATA[<blockquote>
<p>Hmmm, diese Funktionen: Hallo foo(); habe ich aber in main aufgerufen.<br />
gebe das zu bedenken.</p>
</blockquote>
<p>Du kannst nichts aufgerufen haben da die Funktion nirgends definiert ist. Du wirst einen Linker-Error bekommen falls du es versuchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419763</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 28 Sep 2014 20:02:48 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 20:16:17 GMT]]></title><link>https://www.c-plusplus.net/forum/post/2419764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419764</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 28 Sep 2014 20:16:17 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 20:24:25 GMT]]></title><description><![CDATA[<p>Naja nicht wirklich aufgerufen, aber ich habe wie oben beschrieben damit versucht das Objekt vom Typ Hallo anzulegen. Innerhalb von main.</p>
<p>/C</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419767</guid><dc:creator><![CDATA[columbus]]></dc:creator><pubDate>Sun, 28 Sep 2014 20:24:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Sun, 28 Sep 2014 20:25:20 GMT]]></title><description><![CDATA[<p>columbus schrieb:</p>
<blockquote>
<p>Naja nicht wirklich aufgerufen, aber ich habe wie oben beschrieben damit versucht das Objekt vom Typ Hallo anzulegen. Innerhalb von main.</p>
</blockquote>
<p>Nein. Der Compiler geht davon aus, dass du eine Funktion deklarierst. Der kommt gar nicht auf die Idee, dass du da ein Objekt anlegen wolltest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419768</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 28 Sep 2014 20:25:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 00:19:04 GMT]]></title><description><![CDATA[<blockquote>
<p>Der kommt gar nicht auf die Idee, dass du da ein Objekt anlegen wolltest.</p>
</blockquote>
<p>Wie kommt es dann dass Clang mich darauf hinweist dass ich, möglicherweise versehentlich, eine Funktion deklariere? Der Compiler sieht es, muss jedoch den Standard befolgen. Lokale Funktionsdeklarationen sind ein Unsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419778</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 29 Sep 2014 00:19:04 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 08:38:56 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Lokale Funktionsdeklarationen sind ein Unsinn.</p>
</blockquote>
<p>+1<br />
K.a. was man sich dabei gedacht hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419807</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 29 Sep 2014 08:38:56 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 09:14:20 GMT]]></title><description><![CDATA[<p>Dabei muss man sich nichts denken, da es ohne weiteres aus der allgemeinen Syntax der Sprache folgt. Wenn man das nicht will, muss man eine Sonderregel einführen und es speziell verbieten. Das haben K&amp;R natürlich nicht gemacht, weil es in C damit keine Probleme gibt. Wenn du das jetzt in C++ anders machen willst, dann wäre die Bedeutung von</p>
<pre><code class="language-cpp">Objekt Hallo();
</code></pre>
<p>davon abhängig, ob das in einer Funktion oder auf Namespace-Ebene steht ... *das* wäre ziemlich pervers.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419810</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Mon, 29 Sep 2014 09:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 09:23:41 GMT]]></title><description><![CDATA[<p>Man entfernt einfach Deklarationen, Problem geloest. <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="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419812</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 29 Sep 2014 09:23:41 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 09:42:06 GMT]]></title><description><![CDATA[<p>Warum erlaubt man eigentlich nicht einfach auch lokale Funktionsdefinitionen? Dann würde so eine Deklaration ja wenigstens noch Sinn machen und konsistenter wäre es auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419815</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 29 Sep 2014 09:42:06 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 13:47:26 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Warum erlaubt man eigentlich nicht einfach auch lokale Funktionsdefinitionen? Dann würde so eine Deklaration ja wenigstens noch Sinn machen und konsistenter wäre es auch...</p>
</blockquote>
<p>Erlaubt man doch: Das heißt Lambda.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Der kommt gar nicht auf die Idee, dass du da ein Objekt anlegen wolltest.</p>
</blockquote>
<p>Wie kommt es dann dass Clang mich darauf hinweist dass ich, möglicherweise versehentlich, eine Funktion deklariere? Der Compiler sieht es, muss jedoch den Standard befolgen.</p>
</blockquote>
<p>Du weißt, was ich sagen wollte. columbus dachte scheinbar immer noch, er würde da irgendetwas aufrufen, weil er gar nicht auf die Idee kam, dass der Compiler da etwas anderes reininterpretieren würde. Deswegen formulierte ich das so drastisch. Dein Beitrag trägt jetzt nur zur Verwirrung bei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419856</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 29 Sep 2014 13:47:26 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 14:20:01 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Erlaubt man doch: Das heißt Lambda.</p>
</blockquote>
<p>Das ist aber nicht das gleiche, mit der selben Begründung könnte man ja sagen dass normale Funktionen auch nicht gebraucht werden, schließlich kann ich auch globale Lambdas benutzen:</p>
<pre><code>auto f1 = []{};
void f2() {}

int main() {
    f1();
    f2();
}
</code></pre>
<p>Allerdings würde bei einer normalen Funktion wohl niemand auf die Idee kommen ein Lambda zu verwenden. Die eigentliche Frage die sich mir stellt ist warum man Funktionen hier beschränkt und keine nested Funktionen erlaubt.</p>
<p>Ich fände zum Beispiel</p>
<pre><code>void f1() {
    int f2() { return 1; }
    f2();
}
</code></pre>
<p>wesentlich &quot;schöner&quot; und expliziter zu lesen als</p>
<pre><code>void f1() {
    auto f2 = []()-&gt;int{ return 1; };
    f2();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2419858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419858</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 29 Sep 2014 14:20:01 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 14:29:44 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>wesentlich &quot;schöner&quot; und expliziter zu lesen als</p>
<pre><code>void f1() {
    auto f2 = []()-&gt;int{ return 1; };
    f2();
}
</code></pre>
</blockquote>
<p>Innere Funktionen dürfen gerne auffallen, damit man sie nicht mit Blöcken verwechselt, zum Beispiel durch das Semikolon.</p>
<p>Außerdem möchten lokale Funktionen meist auf Variablen der äußeren Funktion zugreifen, was man mit Lambda-Ausdrücken syntaktisch vernünftig gelöst hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419860</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Mon, 29 Sep 2014 14:29:44 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 14:32:25 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>[...]</p>
</blockquote>
<p>Die Syntax von Lambdas ist halt anders und Lambdas sind auch keine &quot;echten&quot; Funktionen, sondern Klassenobjekte mit operator(). nested functions sind schwierig für den Compiler zu implementieren, u.a. auch wegen etwaigen Zugriff auf Variablen der umschließenden Funktion.<br />
Man hätte Lambdas auch die Syntax von normalen Funktionen geben können, aber das würde wohl zu sehr die Grammatik verändern und Ambiguitäten hervorrufen oder so, deswegen dieses &quot;exotische&quot; mit dem [].</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419862</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 29 Sep 2014 14:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 14:35:34 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Außerdem möchten lokale Funktionen meist auf Variablen der äußeren Funktion zugreifen, was man mit Lambda-Ausdrücken syntaktisch vernünftig gelöst hat.</p>
</blockquote>
<p>Schon, aber man könnte ja problemlos beides anbieten, oder?</p>
<p>Aber es stimmt wohl dass man eh in den allermeisten Fällen irgendwas capturen will. Ich find es halt nur komisch dass da diese Ausnahme existiert, weil alle anderen Sachen kann man beliebig nesten (structs, namespaces, etc.), nur Funktionen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419864</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 29 Sep 2014 14:35:34 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 21:43:11 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>nested functions sind schwierig für den Compiler zu implementieren, u.a. auch wegen etwaigen Zugriff auf Variablen der umschließenden Funktion.</p>
</blockquote>
<p>Müsste man ja nicht erlauben. Nested classes können das in C++ auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419935</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 29 Sep 2014 21:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to Konstruktor mit Klammern aufrufen on Mon, 29 Sep 2014 22:19:45 GMT]]></title><description><![CDATA[<p>Das Problem wird Linkage sein. Eine lokale Funktion hätte keine.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2419939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2419939</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 29 Sep 2014 22:19:45 GMT</pubDate></item></channel></rss>