<?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[Object call by reference]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>in folgendem Code (hier nur wesentliche Fragmente) erhalte ich beim Compilieren eine Fehlermeldung, die ich mir nicht erklären kann:</p>
<pre><code class="language-cpp">player.h
--------

class Player {
  public:  

	...

    char GetColor();

  private:

    ...

    char m_Color;
};

player.cpp
----------

#include &quot;player.h&quot;

...

char Player::GetColor() {
  return m_Color;
}

fieldcell.h
-----------

#include &quot;player.h&quot;

class Fieldcell {

  public:

	...

    bool isOpponent(const Player&amp; player);

  private:

    ...

    char m_Color;   

fieldcell.cpp
-------------

#include &quot;fieldcell.h&quot;
#include &quot;player.h&quot;

...

bool Fieldcell::isOpponent(const Player&amp; player) {
  if (m_Color != 'N')
    return m_Color != player.GetColor();
  else
    return false;
}
</code></pre>
<p>Die Meldung (compiliert mit g++) lautet:</p>
<pre><code>fieldcell.cpp: In member function ‘bool Fieldcell::isOpponent(const Player&amp;)’:
fieldcell.cpp:60: error: passing ‘const Player’ as ‘this’ argument of ‘char Player::GetColor()’ discards qualifiers
</code></pre>
<p>Danke für Eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/264223/object-call-by-reference</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 01:01:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264223.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 04 Apr 2010 16:17:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Object call by reference on Sun, 04 Apr 2010 16:17:42 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>in folgendem Code (hier nur wesentliche Fragmente) erhalte ich beim Compilieren eine Fehlermeldung, die ich mir nicht erklären kann:</p>
<pre><code class="language-cpp">player.h
--------

class Player {
  public:  

	...

    char GetColor();

  private:

    ...

    char m_Color;
};

player.cpp
----------

#include &quot;player.h&quot;

...

char Player::GetColor() {
  return m_Color;
}

fieldcell.h
-----------

#include &quot;player.h&quot;

class Fieldcell {

  public:

	...

    bool isOpponent(const Player&amp; player);

  private:

    ...

    char m_Color;   

fieldcell.cpp
-------------

#include &quot;fieldcell.h&quot;
#include &quot;player.h&quot;

...

bool Fieldcell::isOpponent(const Player&amp; player) {
  if (m_Color != 'N')
    return m_Color != player.GetColor();
  else
    return false;
}
</code></pre>
<p>Die Meldung (compiliert mit g++) lautet:</p>
<pre><code>fieldcell.cpp: In member function ‘bool Fieldcell::isOpponent(const Player&amp;)’:
fieldcell.cpp:60: error: passing ‘const Player’ as ‘this’ argument of ‘char Player::GetColor()’ discards qualifiers
</code></pre>
<p>Danke für Eure Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877524</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Sun, 04 Apr 2010 16:19:51 GMT]]></title><description><![CDATA[<p>GetColor ist keine const Funktion und kann daher nicht auf ein const Objekt aufgerufen werden.</p>
<pre><code class="language-cpp">class Player {
  public:  

    ...

    char GetColor() const; // sag dem Compiler, dass das hier nix ändert

  private:

    ...

    char m_Color;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877525</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:19:51 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Sun, 04 Apr 2010 16:42:20 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>GetColor ist keine const Funktion und kann daher nicht auf ein const Objekt aufgerufen werden.</p>
</blockquote>
<p>Vielen Dank! Kannst Du mir noch sagen, warum</p>
<pre><code class="language-cpp">bool Fieldcell::isEmpty() {
 return m_Stones = 0; 
}
</code></pre>
<p>false liefert, wenn m_Stones = 0 ist? Sollte doch genau dann true sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877533</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Sun, 04 Apr 2010 16:45:08 GMT]]></title><description><![CDATA[<p>Weil es</p>
<pre><code class="language-cpp">bool Fieldcell::isEmpty() {
 return m_Stones == 0; 
}
</code></pre>
<p>heisen muss.</p>
<p>Gut Schuß<br />
VuuRWerK <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/1877536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877536</guid><dc:creator><![CDATA[VuuRWerK]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Sun, 04 Apr 2010 16:56:13 GMT]]></title><description><![CDATA[<p>VuuRWerK schrieb:</p>
<blockquote>
<p>Weil es</p>
<pre><code class="language-cpp">bool Fieldcell::isEmpty() {
 return m_Stones == 0; 
}
</code></pre>
<p>heisen muss.</p>
<p>Gut Schuß<br />
VuuRWerK <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>Oh mei, 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="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877542</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Sun, 04 Apr 2010 16:56:13 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Sun, 04 Apr 2010 17:33:37 GMT]]></title><description><![CDATA[<p>Genau diesen Fehler hättest du mit korrekter Anwendung von Const-Correctness vermeiden können.</p>
<p>Deklariere Memberfunktionen als <code>const</code> , wenn sie das Objekt nicht verändern!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877559</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 04 Apr 2010 17:33:37 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 07:31:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Genau diesen Fehler hättest du mit korrekter Anwendung von Const-Correctness vermeiden können.</p>
<p>Deklariere Memberfunktionen als <code>const</code> , wenn sie das Objekt nicht verändern!</p>
</blockquote>
<p>Bin noch Anfänger, was C++ betrifft.</p>
<p>Was mir in dem Kontext noch nicht klar ist; für sich alleine betrachtet, hätte GetColor() ja nicht const sein müssen. Nun habe ich &quot;zufällig&quot; mal eine konstante (hätte ich ja, naiv betrachtet, nicht konstant machen müssen) Referenz auf ein Objekt der Klasse Player als Parameter im Methodenaufruf einer anderen Klasse übergeben und schon muss GetColor const sein. Angenommen, ich hätte auch noch andere Memberfunktionen aus Player nutzen wollen, dann müssten die alle const sein, obwohl das, für die Klasse alleine betrachtet, vielleicht garnicht nötig oder sogar hinderlich wäre?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877695</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 07:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 07:42:50 GMT]]></title><description><![CDATA[<p>Es geht nicht um wollte oder könnte, sondern darum, dass alle Methoden die das Objekt nicht verändern ein const bekommen sollen. Mehr nicht.<br />
Wenn du ein Objekt als const Referenz übergibst hast du deine Gründe. Wenn du dann das Objekt aber verändern willst, hast DU einen Fehler gemacht. Nicht dass du einige Funktionen const spezifiziert hast, sondern dass DU eine const-Referenz übergeben hast. Dann musst du die Referenz auf non-const ändern.</p>
<pre><code class="language-cpp">struct Test {
    void test1() const;
    void test2();
    void test3(const Test&amp; t) {
        t.test1(); // OK
        t.test2(); // ERROR
    }
    void test4(Test&amp; t) {
        t.test1(); // OK
        t.test2(); // OK
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877696</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 05 Apr 2010 07:42:50 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 08:10:54 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Es geht nicht um wollte oder könnte, sondern darum, dass alle Methoden die das Objekt nicht verändern ein const bekommen sollen. Mehr nicht. ....</p>
</blockquote>
<p>Danke für den Hinweis, das beantwortet meine Frage.</p>
<p>Nun habe ich ein weiteres Problem;</p>
<pre><code class="language-cpp">main.h
------
const char PLAYERW = 'W';
const char PLAYERB = 'B';
const char PLAYERN = 'N';

fieldcell.h
-----------
#include &quot;player.h&quot;
#include &quot;main.h&quot;

class Fieldcell {

  public:
    Fieldcell(int stones = 0, const char&amp; color = PLAYERN);
    ~Fieldcell();
    bool isEmpty();
    ...

playfield.h
-----------

#include &quot;main.h&quot;
#include &quot;player.h&quot;
#include &quot;fieldcell.h&quot;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;vector&gt;

class Playfield {

  public:
    Playfield(int rows = 3, int columns = 3);
    ~Playfield();
    void Visualize();

    std::vector&lt;Fieldcell&gt; battlefield;

  private:
    int m_Rows;
    int m_Columns;
};

playfield.cpp
-------------
#include &quot;playfield.h&quot;
#include &quot;fieldcell.h&quot;
#include &quot;player.h&quot;
#include &quot;main.h&quot;
#include &lt;vector&gt;

using namespace std;

Playfield::Playfield(int rows, int cols) {

  m_Rows = rows;
  m_Columns = cols;

  // battlefield.reserve(m_Rows * m_Columns);

  for(int i = 0; i &lt; m_Rows; i++) {
    for(int j = 0; j &lt; m_Columns; j++) {
      battlefield.push_back(0, PLAYERN);
    }
  }
}
</code></pre>
<p>(hier) Zeile 63 wird vom Compiler als Fehler gemeldet:</p>
<blockquote>
<p>playfield.cpp: In constructor ‘Playfield::Playfield(int, int)’:<br />
playfield.cpp:19: error: no matching function for call to ‘std::vector&lt;Fieldcell, std::allocator&lt;Fieldcell&gt; &gt;::push_back(int, const char&amp;)’<br />
/usr/include/c++/4.4/bits/stl_vector.h:733: note: candidates are: void std::vector&lt;_Tp, _Alloc&gt;::push_back(const _Tp&amp;) [with _Tp = Fieldcell, _Alloc = std::allocator&lt;Fieldcell&gt;]<br />
make: *** [playfield.o] Fehler 1</p>
</blockquote>
<p>Habe ich die vector deklaration falsch verstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877700</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877700</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 08:10:54 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 08:21:30 GMT]]></title><description><![CDATA[<p><a href="http://www.cplusplus.com/reference/stl/vector/push_back/" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/push_back/</a><br />
push_back hat nur einen Parameter, du übergibst 2.</p>
<p>Fieldcell::isEmpty() wäre übrigens nocht ein Kandidat für const, ebenso Playfield::Visualize(), was ja nur das Spielfeld ausgibt und nicht ändert, oder?<br />
Im übrigen sagt mir <a href="http://dict.leo.org" rel="nofollow">dict.leo.org</a>, dass Spielfeld im englischen nur &quot;field&quot; heißt, oder &quot;playing field&quot; nicht aber &quot;playfield&quot;, was ja die Übersetzung 1:1 ins Deutsche wäre <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/1877702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877702</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 05 Apr 2010 08:21:30 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 08:44:23 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p><a href="http://www.cplusplus.com/reference/stl/vector/push_back/" rel="nofollow">http://www.cplusplus.com/reference/stl/vector/push_back/</a><br />
push_back hat nur einen Parameter, du übergibst 2.</p>
</blockquote>
<p>Schon klar, aber in dem Fall addiere ich kein int, sondern ein Objekt. Im Buch wird als Beispiel ein string addiert, der direkt als literal angegeben wird. Nun dachte ich, dass das string-objekt anonym erzeugt wird und ein Parameter des string-Konstruktors angegeben wird (also vectorobj.push_back(&quot;test&quot;). Also ging ich davon aus, dass ich die Parameter des Konstruktors von Fieldcell übergeben muss. Letztlich muss ich also zuerst eine (nicht anonyme) Instanz von Fieldcell erzeugen und die an push_back übergeben?</p>
<blockquote>
<p>Fieldcell::isEmpty() wäre übrigens nocht ein Kandidat für const, ebenso Playfield::Visualize(), was ja nur das Spielfeld ausgibt und nicht ändert, oder?<br />
Im übrigen sagt mir <a href="http://dict.leo.org" rel="nofollow">dict.leo.org</a>, dass Spielfeld im englischen nur &quot;field&quot; heißt, oder &quot;playing field&quot; nicht aber &quot;playfield&quot;, was ja die Übersetzung 1:1 ins Deutsche wäre <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>Ja, aber Leerstellen in Klassennamen sind nicht erlaubt und field hört sich so uneindeutig an. <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 />
Übrigens, nicht dass hier jemand denkt, ich lasse meine &quot;Hausaufgaben&quot; hier machen (wird ja für Neulinge ganz klar angedeutet). Ich mache zwar ein Studium, aber da wird Java gelernt und das hier war eine Programmieraufgabe aus vergangener Zeit (mit der ich selbst nichts zu tun hatte/habe), die ich als Übung just for fun versuche, in c++ zu schreiben (ohne dass ich den Java-Code besitze, nur die Spezifikation), da das Lernen von c++ rein eigenes Interesse ist. Hoffe, das ist klar genug. <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/1877711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877711</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 08:44:23 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 08:57:02 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Im Buch wird als Beispiel ein string addiert, der direkt als literal angegeben wird. Nun dachte ich, dass das string-objekt anonym erzeugt wird und ein Parameter des string-Konstruktors angegeben wird (also vectorobj.push_back(&quot;test&quot;). Also ging ich davon aus, dass ich die Parameter des Konstruktors von Fieldcell übergeben muss. Letztlich muss ich also zuerst eine (nicht anonyme) Instanz von Fieldcell erzeugen und die an push_back übergeben?</p>
</blockquote>
<p>Er kann das eine Argument, das push_back erwartet als einzelnen Parameter für den Konstruktor &quot;std::string(const char*)&quot; erkennen und damit den passenden Konstruktor identifizieren.<br />
Aber wie soll er wissen, dass push_back(0, PLAYERN) diesen Konstruktor aufrufen soll? push_bask erwartet EINEN Parameter. Wenn du ein Objekt anhängen (nicht addieren, btw) willst musst du ein Objekt erstellen, auch wenn du das nur temporär direkt in push_back machst:</p>
<pre><code class="language-cpp">battlefield.push_back(Fieldcell(0, PLAYERN));
</code></pre>
<blockquote>
<p>Ja, aber Leerstellen in Klassennamen sind nicht erlaubt und field hört sich so uneindeutig an. <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>Dafür gibt es doch wunderbare Möglichkeiten <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 />
class playing_field, oder mit CamelCase class PlayingField. Denn wenn du schon englische Namen vergibst, sollten die auch passen (mMn), sonst kannst du das auch gleich mit deutschen Namen machen <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/1877715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877715</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 05 Apr 2010 08:57:02 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 08:58:09 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Im Buch wird als Beispiel ein string addiert, der direkt als literal angegeben wird. Nun dachte ich, dass das string-objekt anonym erzeugt wird und ein Parameter des string-Konstruktors angegeben wird (also vectorobj.push_back(&quot;test&quot;). Also ging ich davon aus, dass ich die Parameter des Konstruktors von Fieldcell übergeben muss. Letztlich muss ich also zuerst eine (nicht anonyme) Instanz von Fieldcell erzeugen und die an push_back übergeben?</p>
</blockquote>
<p>Das funktioniert bei Klassen, die einen impliziten Konstruktor mit <strong>einem</strong> Parameter besitzen, z.B. bei <code>std::string</code> .</p>
<pre><code class="language-cpp">std::string::string(const char* c_str);
</code></pre>
<p>Dann kannst du einen <code>const char*</code> übergeben, wo ein <code>std::string</code> gefordert ist, und es wird eine implizite Typkonvertierung durchgeführt. Man spricht auch von Konvertierungskonstruktor. Wenn der Konstruktor von String als <code>explicit</code> deklariert wäre, würde das nicht mehr funktionieren.</p>
<p>Auf mehrere Parameter kannst du das nicht übertragen. Da musst du ein temporäres Objekt übergeben:</p>
<pre><code class="language-cpp">battlefield.push_back(Fieldcell(0, PLAYERN));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877716</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Apr 2010 08:58:09 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 09:09:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20104">@l</a>'abra d'or, <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>,</p>
<p>danke Euch für die Antwort. Ich hatte zwischenzeitlich</p>
<pre><code class="language-cpp">Fieldcell newCell(0, PLAYERN);
battlefield.push_back(newCell);
</code></pre>
<p>benutzt, was auch funktioniert. Ist das &quot;unschön&quot;, oder ohnehin das Gleiche wie</p>
<pre><code class="language-cpp">battlefield.push_back(Fieldcell(0, PLAYERN));
</code></pre>
<p>da bin ich mir garnicht so sicher, Letzteres sieht &quot;anonymer&quot; aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877721</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 09:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 09:27:55 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>da bin ich mir garnicht so sicher, Letzteres sieht &quot;anonymer&quot; aus.</p>
</blockquote>
<p>Ist es auch. <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>Während das temporäre Objekt nach der Zeile nicht mehr existiert, kannst du auf <code>newCell</code> immer noch zugreifen. Ist zwar eine potenzielle Fehlerquelle, aber keine schlimme. Wenn es dir in der Übersicht hilft, kannst du das Objekt ruhig separat deklarieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877732</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Apr 2010 09:27:55 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 09:48:34 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Während das temporäre Objekt nach der Zeile nicht mehr existiert, kannst du auf <code>newCell</code> immer noch zugreifen. Ist zwar eine potenzielle Fehlerquelle, aber keine schlimme. Wenn es dir in der Übersicht hilft, kannst du das Objekt ruhig separat deklarieren.</p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Ok, danke, die temporäre Lösung gefällt mir sogar besser.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20104">@l</a>'abra d'or: Die Klasse heisst jetzt PlayingField. <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>Weitere Frage (ich hoffe, ich nerve nicht zuviel!):</p>
<pre><code class="language-cpp">PlayingField::PlayingField(int rows, int cols) {

  m_Rows = rows;
  m_Columns = cols;

  // BattleArray.reserve(m_Rows * m_Columns);

  int k = 0;
  for(int i = 0; i &lt; m_Rows; i++) {
    for(int j = 0; j &lt; m_Columns; j++) {
      BattleArray.push_back(BattleArrayField(0, PLAYERN));      
      if (i == 0 || i == m_Rows - 1) {
        if (j == 0 || j == m_Columns - 1)
          BattleArray[k].setMaxstones(1);
        else
          BattleArray[k].setMaxstones(2);
      }
      else {
        if (j == 0 || j == m_Columns - 1)
          BattleArray[k].setMaxstones(2);
        else
          BattleArray[k].setMaxstones(3);
      }
      k++;
    }
  }
}
</code></pre>
<p>Ist es guter/schlechter Programmierstiel, solche Initialisierungen im Konstruktor zu machen? Und gibt es zweidimensionale vektoren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877737</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 09:48:34 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 10:25:47 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Und gibt es zweidimensionale vektoren?</p>
</blockquote>
<p>Ja, du kannst <code>std::vector</code> verschachteln. Oder sowas wie <code>boost::multi_array</code> verwenden.</p>
<pre><code class="language-cpp">std::vector&lt;std::vector&lt;FieldCell&gt; &gt; myCells;
// hier Grösse setzen
myCells[x][y] = /* ... */;
</code></pre>
<p>Alternativ 2D-Feld auf ein eindimensionales Array abbilden. Dann schreibst du dir eine Zugriffsfunktion, um eine 2D-Schnittstelle zu haben.</p>
<pre><code class="language-cpp">std::vector&lt;FieldCell&gt; myCells;

FieldCell&amp; At(unsigned int x, unsigned int y)
{
    return myCells[x + myWidth*y];
}

// Const-Überladung, wenn nur lesend zugegriffen wird
const FieldCell&amp; At(unsigned int x, unsigned int y) const;
</code></pre>
<p>wollewausfander schrieb:</p>
<blockquote>
<p>Ist es guter/schlechter Programmierstiel, solche Initialisierungen im Konstruktor zu machen?</p>
</blockquote>
<p>Es ist durchaus guter Stil, wenn eine Klasse nach dem Konstruktoraufruf bereits fertig initialisiert ist. Was du allerdings tun könntest, ist die Initialisierungsliste statt Zuweisungen zu verwenden:</p>
<pre><code class="language-cpp">PlayingField::PlayingField(int rows, int cols)
: m_Rows(rows)
, m_Columns(cols)
{
   // ...
}
</code></pre>
<p>Wenn dein Konstruktorrumpf länger wird, könntest du die Schleifen auch in eine private Memberfunktion auslagern und diese Funktion im Konstruktor aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877757</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Apr 2010 10:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 12:55:04 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Alternativ 2D-Feld auf ein eindimensionales Array abbilden. Dann schreibst du dir eine Zugriffsfunktion, um eine 2D-Schnittstelle zu haben.</p>
<pre><code class="language-cpp">std::vector&lt;FieldCell&gt; myCells;

FieldCell&amp; At(unsigned int x, unsigned int y)
{
    return myCells[x + myWidth*y];
}

// Const-Überladung, wenn nur lesend zugegriffen wird
const FieldCell&amp; At(unsigned int x, unsigned int y) const;
</code></pre>
</blockquote>
<p>Danke. Was wird denn hier zurück gegeben? Eine Referenz auf das Objekt, oder eine Kopie des Objekts?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877798</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 12:55:04 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 12:57:57 GMT]]></title><description><![CDATA[<p>Eine Referenz auf das Objekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877800</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 05 Apr 2010 12:57:57 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 14:21:52 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Eine Referenz auf das Objekt.</p>
</blockquote>
<p>Vielen Dank.</p>
<p>In folgendem Code</p>
<pre><code class="language-cpp">void PlayingField::recursiveCascade() {
    bool isOverflow = false;
    int row = 0;
    int col = 0;
    int k = 0;
    char color = ' ';
    vector&lt;BattleArrayField&gt;::const_iterator myIterator;

    for (myIterator = BattleArray.begin(); myIterator != BattleArray.end(); myIterator++) {
        if ((*myIterator).isOverflow()) {
            color = (*myIterator).getColor();
            isOverflow = true;
            row = k / m_Columns;
            col = k % m_Columns;
            // cout &lt;&lt; &quot;Zeile: &quot; &lt;&lt; row &lt;&lt; &quot;, Spalte: &quot; &lt;&lt; col &lt;&lt; endl;
            if (row == 0) {
                if (col == 0) {
                    BattleArray[k].decStones();
                    BattleArray[k+1].incStones();
                    ...
                    ...
               }
            }
        }
        k++;
    }
    if (isOverflow)
      recursiveCascade();
}
</code></pre>
<p>hatte ich Zeile 28 zuvor so:</p>
<pre><code class="language-cpp">this.recursiveCascade();
</code></pre>
<p>da ich mich ja in einer PlayingField-Instanz befinde. Dies wurde aber vom Compiler beanstandet:</p>
<blockquote>
<p>PlayingField.cpp: In member function ‘void PlayingField::recursiveCascade()’:<br />
PlayingField.cpp:189: error: request for member ‘recursiveCascade’ in ‘this’, which is of non-class type ‘PlayingField* const’<br />
make: *** [PlayingField.o] Fehler 1</p>
</blockquote>
<p>Das kann ich mir garnicht erklären. Und dann noch:</p>
<pre><code class="language-cpp">void PlayingField::setStone(const Player&amp; player, const string&amp; coord) {

  // Bsp: coord = &quot;C5&quot;
  // Im header: alpha_index = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;;

  const char * scolumn = &amp;coord[1];
  int column = atoi(scolumn) - 1;  

  char srow = coord[0];
  size_t rowsearch = alphaIndex.find(srow);
  int row = (int)rowsearch;

  int k = row * m_Columns + column;

  cout &lt;&lt; &quot;Zeile: &quot; &lt;&lt; row &lt;&lt; &quot;, Spalte: &quot; &lt;&lt; column &lt;&lt; &quot;, Feld: &quot; &lt;&lt; k &lt;&lt; endl;

  if (!BattleArray[k].isOpponent(player) || BattleArray[k].isEmpty()) {
  ....
</code></pre>
<p>Zeile 5 hatte ich ursprünglich so:</p>
<pre><code class="language-cpp">char scolumn = coord[1];
</code></pre>
<p>was aber beanstandet wurde, was ich mir nicht erklären kann. Und überhaupt; gibt es einen besseren Weg, coord zu dekodieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877844</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 14:21:52 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 14:29:05 GMT]]></title><description><![CDATA[<p>this ist eine Zeiger!</p>
<pre><code class="language-cpp">// this.recursiveCascade();
this-&gt;recursiveCascade();
</code></pre>
<p>Ansonsten ist das ein Konstanter Zeiger auf ein PlayingField (1) und nicht ein Zeiger auf ein konstantes PlayingField (2).</p>
<pre><code class="language-cpp">PlayingField const *ptr1; // (1)
const PlayingField *ptr2; // (1)
PlayingField * const ptr3; // (2)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877847</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 05 Apr 2010 14:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 14:42:56 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Zeile 5 hatte ich ursprünglich so:</p>
<pre><code class="language-cpp">char scolumn = coord[1];
</code></pre>
<p>was aber beanstandet wurde, was ich mir nicht erklären kann. Und überhaupt; gibt es einen besseren Weg, coord zu dekodieren?</p>
</blockquote>
<ol>
<li>&quot;beanstandet wurde&quot; ist keine Fehlermeldung. Die brauchen wir aber um das Problem korrekt einschätzen zu können.</li>
<li>Nehm ich dir das Statement nicht ab.<br />
Ich nehme eher an, das sah vorher so aus:</li>
</ol>
<pre><code class="language-cpp">char* scolumn = &amp;coord[1];
</code></pre>
<p>Und das geht eben wegen dem kleinen dummen const wieder nicht <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 />
<a href="http://www.cplusplus.com/reference/string/string/operator%5B%5D/" rel="nofollow">http://www.cplusplus.com/reference/string/string/operator[]/</a><br />
Denn die Zeile wie du sie da stehen hast kompiliert einwandfrei.</p>
<p>Überhaupt den Link <a href="http://www.cplusplus.com/reference/" rel="nofollow">http://www.cplusplus.com/reference/</a> gut aufheben, die Doku ist das wichtigste Werkzeug für dich, ohne der bist du aufgeschmissen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1877854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877854</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 05 Apr 2010 14:42:56 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 15:18:26 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<ol>
<li>&quot;beanstandet wurde&quot; ist keine Fehlermeldung. Die brauchen wir aber um das Problem korrekt einschätzen zu können.</li>
</ol>
</blockquote>
<p>Sorry:</p>
<pre><code>PlayingField.cpp: In member function ‘void PlayingField::setStone(const Player&amp;, const std::string&amp;)’:
PlayingField.cpp:196: error: invalid conversion from ‘char’ to ‘const char*’
PlayingField.cpp:196: error:   initializing argument 1 of ‘int atoi(const char*)’
make: *** [PlayingField.o] Fehler 1
</code></pre>
<p>l'abra d'or schrieb:</p>
<blockquote>
<ol start="2">
<li>Nehm ich dir das Statement nicht ab.<br />
Ich nehme eher an, das sah vorher so aus:</li>
</ol>
<pre><code class="language-cpp">char* scolumn = &amp;coord[1];
</code></pre>
<p>Und das geht eben wegen dem kleinen dummen const wieder nicht <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 />
<a href="http://www.cplusplus.com/reference/string/string/operator%5B%5D/" rel="nofollow">http://www.cplusplus.com/reference/string/string/operator[]/</a><br />
Denn die Zeile wie du sie da stehen hast kompiliert einwandfrei.</p>
</blockquote>
<p>Als Anfänger widerspreche ich natürlich nicht gerne, aber es ist leider genau umgekehrt. Nur mit</p>
<pre><code class="language-cpp">const char* scolumn = &amp;coord[1];
</code></pre>
<p>läuft alles ohne Meldung durch.</p>
<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Überhaupt den Link <a href="http://www.cplusplus.com/reference/" rel="nofollow">http://www.cplusplus.com/reference/</a> gut aufheben, die Doku ist das wichtigste Werkzeug für dich, ohne der bist du aufgeschmissen <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>Den habe ich in der Linkliste, aber mein Buch liegt auch hier auf dem Tisch. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1877873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877873</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 15:18:26 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 15:20:45 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>this ist eine Zeiger!</p>
<pre><code class="language-cpp">// this.recursiveCascade();
this-&gt;recursiveCascade();
</code></pre>
</blockquote>
<p>Oh ja, stimmt ja, sorry.</p>
<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Ansonsten ist das ein Konstanter Zeiger auf ein PlayingField (1) und nicht ein Zeiger auf ein konstantes PlayingField (2).</p>
<pre><code class="language-cpp">PlayingField const *ptr1; // (1)
const PlayingField *ptr2; // (1)
PlayingField * const ptr3; // (2)
</code></pre>
</blockquote>
<p>Woher weiss man (weiss ich) denn, dass es sich um einen konstanten Zeiger handelt? Oder sind this-Zeiger immer konstant?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1877876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877876</guid><dc:creator><![CDATA[wollewausfander]]></dc:creator><pubDate>Mon, 05 Apr 2010 15:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 15:29:11 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Oder sind this-Zeiger immer konstant?</p>
</blockquote>
<p>Genau genommen sind es skalare RValues, und diese können nicht verändert werden. Das ist wie wenn du <code>3 = 4</code> schreibst.</p>
<p>Befindest du dich zudem in einer <code>const</code> -Methode, zeigt <code>this</code> auf ein konstantes Objekt, ansonsten nicht.</p>
<pre><code class="language-cpp">void MyClass::MemberFunction()
{
    this; // Typ MyClass*
}

void MyClass::MemberFunction() const
{
    this; // Typ const MyClass*
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1877880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877880</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Apr 2010 15:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Object call by reference on Mon, 05 Apr 2010 15:40:48 GMT]]></title><description><![CDATA[<p>wollewausfander schrieb:</p>
<blockquote>
<p>Als Anfänger widerspreche ich natürlich nicht gerne, aber es ist leider genau umgekehrt. Nur mit</p>
<pre><code class="language-cpp">const char* scolumn = &amp;coord[1];
</code></pre>
<p>läuft alles ohne Meldung durch.</p>
</blockquote>
<p>Die Fehlermeldung spricht aber ein anderes Wort <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 />
Dass &quot;const char* c = &amp;coord[1];&quot; geht bezweifle ich nicht.<br />
Dass &quot;char c = coord[1];&quot; hingegen einen Fehler gibt - jenen von dir geposteten - bezweifle ich sehr wohl!<br />
Deiner Fehlermeldung zufolge machst du so etwas:</p>
<pre><code class="language-cpp">const char* c = s[0];
</code></pre>
<p>Was willst du jetzt eigentlich genau haben, einen char oder einen (const) char*?</p>
<p>BTW: eine Klasse &quot;FieldIndex&quot; wäre nicht schlecht. Denn die Koordinate in allen benötigten Funktionen erst aus nem String zu extrahieren ist witzlos <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/1877887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1877887</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 05 Apr 2010 15:40:48 GMT</pubDate></item></channel></rss>