<?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[String als Parameter]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Nachdem ich einige Zeit nun mit C Programmiere, wollte ich meinen Kenntnisstand auf C++ ausweiten. Als Geeignetes Testbeispiel hatte ich ein Snake Klon im Sinn. Nur habe ich einen Fehler gemacht, den ich irgentwie nicht verstehe:</p>
<p>Bisher dachte ich das die Libs von C++ kein Endung haben. Wenn ich allerdings das &quot;.h&quot; weg lasse erhalte ich, für den vector feld, folgende Fehlermeldungen:</p>
<p>error: ISO C++ forbids declaration of <code>vector' with no type error: expected</code>;' before '&lt;' token</p>
<p>Beim String ist es egal ob mit oder ohne Endung ich erhalte immer:</p>
<p>error: expected `)' before &quot;dateinname&quot;</p>
<p>Und nun zu meiner Frage:<br />
Was mache ich Falsch? Wie wäre die Richtige Schreibweise?</p>
<p>Hier die Spielfeld.hpp</p>
<pre><code class="language-cpp">#ifndef H_SPIELFELD
#define H_SPIELFELD

#include &lt;cstdarg&gt;
#include &lt;vector.h&gt;
#include &lt;fstream.h&gt;
#include &lt;string&gt;

class spielfeld {
    private:
    //  Feld variablen
        int feldx, feldy;
        vector&lt;char&gt; feld;

    public:
    // Konstruktur
        spielfeld(int x, int y);
        spielfeld(char *dateinname);
        spielfeld(string dateinname);
        spielfeld(fstream &amp;datei);
    // Indexoperator
        char&amp;  operator[](int x,...) ;
    // Destruktur
       //  ~spielfeld();

    // getter

        int size_x(void) const;
        int size_y(void) const;

    ////////////////////////////////////////////////////////////////////////////
    // Löschen des Feldinhaltes
    ////////////////////////////////////////////////////////////////////////////

    // ein Feld löschen
        void clear(const int x, const int y);
    //einzelnen Wert
        void clear(const char was);
    // das komplette feld
        void clear(void);
};

#endif
</code></pre>
<p>mfg<br />
Fettpet</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/236192/string-als-parameter</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 01:11:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236192.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Mar 2009 21:24:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to String als Parameter on Wed, 11 Mar 2009 21:24:17 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Nachdem ich einige Zeit nun mit C Programmiere, wollte ich meinen Kenntnisstand auf C++ ausweiten. Als Geeignetes Testbeispiel hatte ich ein Snake Klon im Sinn. Nur habe ich einen Fehler gemacht, den ich irgentwie nicht verstehe:</p>
<p>Bisher dachte ich das die Libs von C++ kein Endung haben. Wenn ich allerdings das &quot;.h&quot; weg lasse erhalte ich, für den vector feld, folgende Fehlermeldungen:</p>
<p>error: ISO C++ forbids declaration of <code>vector' with no type error: expected</code>;' before '&lt;' token</p>
<p>Beim String ist es egal ob mit oder ohne Endung ich erhalte immer:</p>
<p>error: expected `)' before &quot;dateinname&quot;</p>
<p>Und nun zu meiner Frage:<br />
Was mache ich Falsch? Wie wäre die Richtige Schreibweise?</p>
<p>Hier die Spielfeld.hpp</p>
<pre><code class="language-cpp">#ifndef H_SPIELFELD
#define H_SPIELFELD

#include &lt;cstdarg&gt;
#include &lt;vector.h&gt;
#include &lt;fstream.h&gt;
#include &lt;string&gt;

class spielfeld {
    private:
    //  Feld variablen
        int feldx, feldy;
        vector&lt;char&gt; feld;

    public:
    // Konstruktur
        spielfeld(int x, int y);
        spielfeld(char *dateinname);
        spielfeld(string dateinname);
        spielfeld(fstream &amp;datei);
    // Indexoperator
        char&amp;  operator[](int x,...) ;
    // Destruktur
       //  ~spielfeld();

    // getter

        int size_x(void) const;
        int size_y(void) const;

    ////////////////////////////////////////////////////////////////////////////
    // Löschen des Feldinhaltes
    ////////////////////////////////////////////////////////////////////////////

    // ein Feld löschen
        void clear(const int x, const int y);
    //einzelnen Wert
        void clear(const char was);
    // das komplette feld
        void clear(void);
};

#endif
</code></pre>
<p>mfg<br />
Fettpet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678368</guid><dc:creator><![CDATA[Fettpet]]></dc:creator><pubDate>Wed, 11 Mar 2009 21:24:17 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Wed, 11 Mar 2009 21:30:15 GMT]]></title><description><![CDATA[<p>Lass das .h auf weg. Es heißt dann aber natürlich std::vector. Das gleiche trifft auf string zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678370</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 11 Mar 2009 21:30:15 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Wed, 11 Mar 2009 21:32:10 GMT]]></title><description><![CDATA[<p>Standardheader haben keine Endung, richtig. Aber die Bezeichner befinden sich alle im Namensraum <code>std</code> , deshalb musst du diesen mittels vorgestelltem <code>std::</code> angeben. Von <code>using namespace</code> rate ich ab, vor allem in Headern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678373</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 11 Mar 2009 21:32:10 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Wed, 11 Mar 2009 21:59:04 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich danke euch. Jetzt Funktioniert es. <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>mfg,<br />
Fettpet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678390</guid><dc:creator><![CDATA[Fettpet]]></dc:creator><pubDate>Wed, 11 Mar 2009 21:59:04 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 12:58:07 GMT]]></title><description><![CDATA[<p>übrigens: shcön formatierter code, gefällt mir...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678661</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Thu, 12 Mar 2009 12:58:07 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 14:07:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">char&amp;  operator[](int x,...) ;
</code></pre>
<p>Wieso haste da ne Elipse (die 3 Pkt)? der op[] unterstützt so und so nur einen Parameter...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678725</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 12 Mar 2009 14:07:56 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 14:08:07 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>übrigens: shcön formatierter code, gefällt mir...</p>
</blockquote>
<p>Ja, und sogar Kommentare <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/1678726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678726</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Thu, 12 Mar 2009 14:08:07 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 14:17:11 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char&amp;  operator[](int x,...) ;
</code></pre>
<p>Wieso haste da ne Elipse (die 3 Pkt)? der op[] unterstützt so und so nur einen Parameter...</p>
</blockquote>
<p>Also ich schreibe an einem Snack Spiel. Hierfür habe ich das Spielfeld in eine Klasse gesteckt. Das Feld ist 2 Dimensional. Ich kann aber nur die x Koordinate abfragen. Hierfür brauche ich die Ellipse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678734</guid><dc:creator><![CDATA[Fettpet]]></dc:creator><pubDate>Thu, 12 Mar 2009 14:17:11 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 14:20:27 GMT]]></title><description><![CDATA[<p>Fettpet schrieb:</p>
<blockquote>
<p>Also ich schreibe an einem Snack Spiel. Hierfür habe ich das Spielfeld in eine Klasse gesteckt. Das Feld ist 2 Dimensional. Ich kann aber nur die x Koordinate abfragen. Hierfür brauche ich die Ellipse.</p>
</blockquote>
<p>Zum einen sind Ellipsen in C++ bestenfalls unschön, zum zweiten wirst Du damit nicht das erreichen was Du möchtest, denn: <strong>Der operator[] hat nur einen Parameter</strong> (per Definition).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678736</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 12 Mar 2009 14:20:27 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 14:54:34 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Fettpet schrieb:</p>
<blockquote>
<p>Also ich schreibe an einem Snack Spiel. Hierfür habe ich das Spielfeld in eine Klasse gesteckt. Das Feld ist 2 Dimensional. Ich kann aber nur die x Koordinate abfragen. Hierfür brauche ich die Ellipse.</p>
</blockquote>
<p>Zum einen sind Ellipsen in C++ bestenfalls unschön, zum zweiten wirst Du damit nicht das erreichen was Du möchtest, denn: <strong>Der operator[] hat nur einen Parameter</strong> (per Definition).</p>
</blockquote>
<p>Mhhhh....</p>
<p>Ok, was für eine schreibweiße würdest du mir empfehlen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678756</guid><dc:creator><![CDATA[Fettpet]]></dc:creator><pubDate>Thu, 12 Mar 2009 14:54:34 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 15:18:27 GMT]]></title><description><![CDATA[<p>Wenn dein Feld so aussieht</p>
<pre><code class="language-cpp">std::vector&lt;std::vector&lt;char&gt; &gt; feld;
</code></pre>
<p>dann kannst du ja einfach ein std::vector&lt;char&gt;&amp; von deinem operator[] zurückgeben lassen.<br />
Eine Alternative wäre der Zugriff über eine normale Memberfunktion.</p>
<pre><code class="language-cpp">char&amp; getElem(size_t x, size_t y) { return feld[x][y]; }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1678770</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678770</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Thu, 12 Mar 2009 15:18:27 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 15:29:15 GMT]]></title><description><![CDATA[<p>Man macht es über ein Proxy-Objekt...<br />
Es gibt auch nen Artikel über Operatorüberladung hier - imho wird da dieses Prob auch angesprochen...</p>
<p>also so was in etwa:</p>
<pre><code class="language-cpp">class proxy
{
private:
  char *first;
  size length; //oder std::vector
public:
  char&amp; operator[](size_t i) {assert (i &lt; length); return first[i];}
  const char&amp; operator[](size_t i) const {assert (i &lt; length); return first[i];}
};

class asd
{
public: //manche definieren auch hier ihr proxy-objekt, um die zugehörigkeit zu zeigen - kann man auch machen - wäre in dem fall wahrscheinlich auch richtiger
private:
  std::vector &lt;proxy&gt; content;
public:
  proxy&amp; operator[](size_t i) {assert (i &lt; content.size()); return content[i];}
  const proxy&amp; operator[](size_t i) const {assert (i &lt; content.size()); return content[i];}
};
</code></pre>
<pre><code class="language-cpp">#inlude &quot;asd.h&quot;

int main()
{
 asd a;
 a[2][3];
}
</code></pre>
<p>verstanden? ^^</p>
<p>bb</p>
<p>edit: die ersten beiden zeilen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1678774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1678774</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 12 Mar 2009 15:29:15 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Thu, 12 Mar 2009 22:31:34 GMT]]></title><description><![CDATA[<p>Oder wenn dir das Aussehen nicht so wichtig ist, kannst du auch eine einfache Memberfunktion mit zwei Parametern schreiben.</p>
<p>Was mir sonst noch aufgefallen ist:</p>
<ul>
<li>Klassentypen solltest du eher als Const-Referenz anstatt als Kopie an Funktionen übergeben. Also <code>const std::string&amp;</code> statt <code>std::string</code> .</li>
<li>Der Konstruktor mit dem <code>std::fstream</code> -Parameter kommt mir komisch vor. Willst du nicht besser nur einen Dateinamen angeben und dann das Streamen lokal vornehmen? Sonst muss der Aufrufer immer sicherstellen, dass er einen gültigen, an die richtige Position zeigenden Stream übergibt.</li>
<li>Parameter, die sowieso kopiert werden, macht man üblicherweise nicht <code>const</code> (bei dir <code>const int</code> und <code>const char</code> ). Das hat damit zu tun, dass es den Aufrufer nicht zu interessieren hat, was innerhalb der Funktion passiert. Ob eine Kopie nun konstant ist oder nicht, ist von aussen gesehen irrelevant.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1679024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679024</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 12 Mar 2009 22:31:34 GMT</pubDate></item><item><title><![CDATA[Reply to String als Parameter on Fri, 13 Mar 2009 11:27:15 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Parameter, die sowieso kopiert werden, macht man üblicherweise nicht <code>const</code> (bei dir <code>const int</code> und <code>const char</code> ). Das hat damit zu tun, dass es den Aufrufer nicht zu interessieren hat, was innerhalb der Funktion passiert. Ob eine Kopie nun konstant ist oder nicht, ist von aussen gesehen irrelevant.</p>
</blockquote>
<p>Und die Funktionen haben die gleiche Signatur:</p>
<pre><code class="language-cpp">void bar(const char i);
void bar(char i);
</code></pre>
<p>Wenn man also den Parameter const machen möchte, dann kann das auch in der Source-Datei erst machen:</p>
<pre><code class="language-cpp">//*.h
void bar (char i);

//*.cpp
#include &quot;a.h&quot;
void bar (const char i)
{
 //...
}
</code></pre>
<p>Ich mach das zwar auch ab und an mal so, aber sinnvoll find ich es nicht ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1679227</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1679227</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 13 Mar 2009 11:27:15 GMT</pubDate></item></channel></rss>