<?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[Objekt in Methode erzeugen.]]></title><description><![CDATA[<p>Hallo <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 />
Mein Problem: Ich möchte in einer Methode von Klasse A eine Objekt von Klasse B erzeugen. In einer weiteren Methode von Klasse A möchte ich mit diesem Objekt dann arbeiten. Leider lässt der Compiler dies nicht zu, scheinbar kennt er das Objekt einfach nicht.<br />
Ich habs mit #include, extern und forward declaration versucht &quot;hinzubiegen&quot;. Aber da ich scheinbar den genauen Unterschied dieser 3 Befehle noch immer nicht verstanden habe hat mir auch das nicht geholfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Erzeuge ich die Objekte am Anfang der File, ausserhalb jeglicher Methoden so funktionierts einwandfrei...</p>
<p>mit extern: undefined reference to <code>_Dice1' ohne extern: error:</code>Dice1' was not declared in this scope<br />
mit forward declaration: error: `Dice1' was not declared in this scope</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &quot;gamehandler.h&quot;
#include &quot;dice.h&quot;
#include &quot;board.h&quot;
#include &quot;piece.h&quot;
#include &quot;player.h&quot;

using namespace std;

extern dice Dice1;
extern dice Dice2;
extern board Board;
extern player Red;

gamehandler GameHandler;
piece* piece_ptr[4];
player Purble;

gamehandler::gamehandler()
{
}

gamehandler::~gamehandler()
{
}

void gamehandler::run()
{
  player Red;
  board Board;
  dice Dice1;
  dice Dice2;

  cout &lt;&lt; &quot;Welcome&quot; &lt;&lt; endl;
  Board.setPieceToStart(piece_ptr[0]);
  GameHandler.nextCommand();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/221447/objekt-in-methode-erzeugen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 02:28:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221447.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 29 Aug 2008 08:49:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Fri, 29 Aug 2008 08:49:42 GMT]]></title><description><![CDATA[<p>Hallo <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 />
Mein Problem: Ich möchte in einer Methode von Klasse A eine Objekt von Klasse B erzeugen. In einer weiteren Methode von Klasse A möchte ich mit diesem Objekt dann arbeiten. Leider lässt der Compiler dies nicht zu, scheinbar kennt er das Objekt einfach nicht.<br />
Ich habs mit #include, extern und forward declaration versucht &quot;hinzubiegen&quot;. Aber da ich scheinbar den genauen Unterschied dieser 3 Befehle noch immer nicht verstanden habe hat mir auch das nicht geholfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Erzeuge ich die Objekte am Anfang der File, ausserhalb jeglicher Methoden so funktionierts einwandfrei...</p>
<p>mit extern: undefined reference to <code>_Dice1' ohne extern: error:</code>Dice1' was not declared in this scope<br />
mit forward declaration: error: `Dice1' was not declared in this scope</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;stdlib.h&gt;
#include &quot;gamehandler.h&quot;
#include &quot;dice.h&quot;
#include &quot;board.h&quot;
#include &quot;piece.h&quot;
#include &quot;player.h&quot;

using namespace std;

extern dice Dice1;
extern dice Dice2;
extern board Board;
extern player Red;

gamehandler GameHandler;
piece* piece_ptr[4];
player Purble;

gamehandler::gamehandler()
{
}

gamehandler::~gamehandler()
{
}

void gamehandler::run()
{
  player Red;
  board Board;
  dice Dice1;
  dice Dice2;

  cout &lt;&lt; &quot;Welcome&quot; &lt;&lt; endl;
  Board.setPieceToStart(piece_ptr[0]);
  GameHandler.nextCommand();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1573428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1573428</guid><dc:creator><![CDATA[sust]]></dc:creator><pubDate>Fri, 29 Aug 2008 08:49:42 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Fri, 29 Aug 2008 08:53:06 GMT]]></title><description><![CDATA[<p>*edit*</p>
<p>beim Erzeugen der Objekte wirft mir der Compiler natürlch keinen Error. Erst wenn ich auf diese dann zugreifen will.</p>
<p>wie zb hier:</p>
<pre><code>void gamehandler::commandRoll()
{
  int roll = Dice1.roll() + Dice2.roll();
  cout &lt;&lt; &quot;You rolled [&quot; &lt;&lt; roll &lt;&lt; &quot;]&quot; &lt;&lt; endl;
  Board.movePiece(roll);
  GameHandler.nextCommand();
}
</code></pre>
<p>danke = )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1573434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1573434</guid><dc:creator><![CDATA[sust]]></dc:creator><pubDate>Fri, 29 Aug 2008 08:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Fri, 29 Aug 2008 09:12:51 GMT]]></title><description><![CDATA[<p>hab erstmal eine Lösung gefundn.<br />
Habe im header von gamehandler Zeiger für die jeweiligen Objekte deklariert. mit new dann die Objekte erzeugt und den Zeigern zugewiesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1573455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1573455</guid><dc:creator><![CDATA[sust]]></dc:creator><pubDate>Fri, 29 Aug 2008 09:12:51 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Fri, 29 Aug 2008 09:15:58 GMT]]></title><description><![CDATA[<p>sust schrieb:</p>
<blockquote>
<p>hab erstmal eine Lösung gefundn.<br />
Habe im header von gamehandler Zeiger für die jeweiligen Objekte deklariert. mit new dann die Objekte erzeugt und den Zeigern zugewiesen.</p>
</blockquote>
<p>Was meinst du mit &quot;den Zeiger zugewiesen&quot;?</p>
<p>Hoffentlich nicht sowas:</p>
<pre><code class="language-cpp">// im Header
Dice *dice;

// im CC
void func(){
  Dice d;
  dice = &amp;d;
}

void func2(){
  dice-&gt;roll();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1573459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1573459</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 29 Aug 2008 09:15:58 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Fri, 29 Aug 2008 12:29:39 GMT]]></title><description><![CDATA[<p>Wenn du Objekte in Methoden deklarierst, sind sie natürlich nur lokal bekannt - das ist ja gerade, was man mit der lokalen Deklaration erreichen will. Ansonsten kannst du die Objekte auch in Klassen deklarieren. Oder eben in der Funktion oder Methode, die sie benötigt.</p>
<p>sust schrieb:</p>
<blockquote>
<p>Ich habs mit #include, extern und forward declaration versucht &quot;hinzubiegen&quot;. Aber da ich scheinbar den genauen Unterschied dieser 3 Befehle noch immer nicht verstanden habe hat mir auch das nicht geholfen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Dann würde ich dir dringend raten, die Grundlagen noch einmal genau anzuschauen. Die von dir genannten Möglichkeiten (keine Befehle!) stellen drei komplett unterschiedliche Sprachmittel dar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1573600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1573600</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 29 Aug 2008 12:29:39 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Mon, 01 Sep 2008 11:45:35 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/17700">@fellhuhn</a>: Nein, die Objekte wie in folgendem Codeausschnit mit new erzeugt und deren Adresse den Zeigern zugewiesen. (hoffentlich halbwegs korrekt ausgedrückt)<br />
Gebe diese natürlich mit delete im destr. wieder frei..<br />
Falls es unschön oder gar falsch sein sollte bitte um rat... Ich will mir c++ weder falsch noch unprofessionell aneignen, auch wenns funktionieren würde : )</p>
<pre><code class="language-cpp">// .header
class gamehandler
{
  private:
    board* board_;
    dice* first_dice_;
    dice* second_dice_;
};

// .cpp
void gamehandler::run()
{
  board_ = new board;
  first_dice_ = new dice;
  second_dice_ = new dice;
}
</code></pre>
<p>@ nexus: Danke, nachdem ich mir die Frage heute nochmal durchgelesen habe wars mir irgendwie peinlich. Natürlich sind auch Objekte die ich in Methoden deklariere nur lokal bekannt, sollte ich eigentlich wissen. Bei Variablen die ich lokal anlege denk ich nichtmal darüber nach weil ichs einfach weiß, aber kaum erzeuge ich ein Objekt vergess ich die Grundlagen *confused*<br />
Mit #include, extern und forward declaration hast du natürlich recht, sobald ich mein c++ Buch wiederhabe werd ich mich nochmal intensiv damit beschäftigen.</p>
<p>-------<br />
Ein sehr ähnliches Problem habe ich nun wieder mit vektoren. (beschäftige mich zum ersten mal damit)</p>
<pre><code class="language-cpp">// .header
#include &lt;string&gt;
#include &lt;vector&gt;

#ifndef field_H
#define field_H

class piece;

class field
{
  protected:
    std::string print_name_;
    std::vector&lt;piece* &gt; pieces_;

  private:
    field(field &amp;);

  public:
    field();
    field(std::string const print_name);
    virtual ~field();
    std::string&amp; getPrintName();
    void setPieces(piece* piece);
    piece* getPieces();

    friend std::ostream &amp;operator&lt;&lt;(std::ostream &amp;ostr, field &amp;field);

};

#endif

// .cpp
#include &quot;field.h&quot;
#include &lt;iostream&gt;

using namespace std;

field::field()
{
}

field::field(string const print_name) : print_name_(print_name)
{
}

field::~field()
{
}

std::string&amp; field::getPrintName()
{
  return print_name_;
}

void field::setPieces(piece* piece)
{
  pieces_.push_back(piece);
}

piece* getPieces()
{
  cout &lt;&lt; pieces_[0]-&gt;getPieceColor() &lt;&lt; endl;
}
</code></pre>
<p><strong>error: `pieces_' was not declared in this scope</strong></p>
<p>Der Vektor &quot;pieces_&quot; ist im headerfile deklariert. In setPieces kann ich noch ohne Probleme ein Element hinzufügen und initialisieren.<br />
Die für Testzwecke eingebaute Ausgabe in getPieces funktioniert allerdings nicht. Dort kennt er pieces_ scheinbar nicht.</p>
<p>danke schonmal : )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574633</guid><dc:creator><![CDATA[sust]]></dc:creator><pubDate>Mon, 01 Sep 2008 11:45:35 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Mon, 01 Sep 2008 11:50:05 GMT]]></title><description><![CDATA[<p>Das wird dir wieder peinlich sein <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 />
Du schreibst:<br />
<code>piece* getPieces()</code><br />
Es müsste heissen:<br />
<code>piece* field::getPieces()</code></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574639</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Mon, 01 Sep 2008 11:50:05 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Mon, 01 Sep 2008 11:59:16 GMT]]></title><description><![CDATA[<p>Was den oberen Code betrifft: Wieso forderst du den Speicher nicht im Konstruktor an? Dann könntest du ihn mit <code>delete</code> im Destruktor wieder ordentlich freigeben. Du musst einfach aufpassen, wenn du die Klasse kopierst oder zuweist, müsstest du Copy-Ctor bzw. Zuweisungsoperator auch noch selbst implementieren.</p>
<pre><code class="language-cpp">class field
{
    field(std::string const print_name);   // Das const hier ist unnötig, siehe Link unten
    virtual ~field();
    std::string&amp; getPrintName();  // Man kann hier den String verändern, ist das beabsichtigt?
    void setPieces(piece* piece);
    piece* getPieces();

    friend std::ostream &amp;operator&lt;&lt;(std::ostream &amp;ostr, field &amp;field);  // 2. Parameter sollte const-Referenz sein
};
</code></pre>
<p>Wegen dem <code>const</code> : <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-221571-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html" rel="nofollow">Hier</a> wurde die Sache sehr gut erläutert.</p>
<p>Ausserdem würde ich die Variablen nicht mit _ beenden, aber das ist natürlich Geschmackssache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574654</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Sep 2008 11:59:16 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Mon, 01 Sep 2008 12:29:33 GMT]]></title><description><![CDATA[<p>autsch autsch, danke Dravere. Ich bin seit 1 Stunde dran den fehler zu finden und am ende wars so primitiv.. 4 Augen sehn doch meist mehr als 2 = )</p>
<p>Tut mit leid das ich eure Zeit mit teils so &quot;dummen&quot; Fragen beanspruche.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Was den oberen Code betrifft: Wieso forderst du den Speicher nicht im Konstruktor an? Dann könntest du ihn mit <code>delete</code> im Destruktor wieder ordentlich freigeben. Du musst einfach aufpassen, wenn du die Klasse kopierst oder zuweist, müsstest du Copy-Ctor bzw. Zuweisungsoperator auch noch selbst implementieren.</p>
</blockquote>
<p>Hm, ich könnts auch im Konstruktor machen. Aber wieso macht das einen Unterschied? Ich geb den Speicher auch so im Destruktor mit delete wieder frei, oder darf ich das dann nicht?<br />
Die Klasse sollte und darf nicht kopiert werden. (Darum auch der Private Copy-Ctor, der dies hoffentlich vermeiden sollte)</p>
<pre><code class="language-cpp">private:
  field(field &amp;);
</code></pre>
<p>Bedanke mich auch ganz Herzlich dass du mich auf meine Fehler beim verwenden(oder auch nicht verwenden) von const hingewiesen hast. Aus diesem grund hab ich gleich meine ganze Klasse gepostet und nicht nur stückweise Codeausschnitte, war mir sichher ich werd auf Fehler aufmerksam gemacht : )</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Ausserdem würde ich die Variablen nicht mit _ beenden, aber das ist natürlich Geschmackssache.</p>
</blockquote>
<p>Habs so als Codingstandard gelernt. Gibt halt keinen internationalen Standard denk ich mal, und ich komm zur Zeit mit diesem ganz gut zurecht *g*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574685</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574685</guid><dc:creator><![CDATA[sust]]></dc:creator><pubDate>Mon, 01 Sep 2008 12:29:33 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Mon, 01 Sep 2008 13:01:33 GMT]]></title><description><![CDATA[<p>sust schrieb:</p>
<blockquote>
<p>Hm, ich könnts auch im Konstruktor machen. Aber wieso macht das einen Unterschied? Ich geb den Speicher auch so im Destruktor mit delete wieder frei, oder darf ich das dann nicht?</p>
</blockquote>
<p>Es kommt eben drauf an, wann du die Variablen benötigst. Wenn du sowieso jedes Mal nach dem Konstruieren eines Objekts die <code>run()</code> -Methode aufrufst, könntest du es gerade so gut im Konstruktor machen. Aber falls das Objekt zuerst noch mit Nullpointern verweilen soll, ist es schon gut, wie du es machst <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/1574718</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574718</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 01 Sep 2008 13:01:33 GMT</pubDate></item><item><title><![CDATA[Reply to Objekt in Methode erzeugen. on Mon, 01 Sep 2008 13:07:32 GMT]]></title><description><![CDATA[<p>okay alles klar danke.<br />
naja werds jetz dann bleiben lassn, bei mir im kopf herrscht grad soviel chaos und verwirrung das ich kein codestück mehr auf die reihe bringe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574726</guid><dc:creator><![CDATA[sust]]></dc:creator><pubDate>Mon, 01 Sep 2008 13:07:32 GMT</pubDate></item></channel></rss>