<?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[Referenzen in abstrakten und davon abgeleiteten Klassen]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>bin gerade ziemlich gefrustet, denn so langsam aber sicher bringt mich das Referenzkonzept von C++ um! Die Sprache ist doch schon komplex und schwierig genug!</p>
<p>Hatte mir folgendes überlegt:</p>
<p>Eine abstrakte Basisklasse stellt wiederverwendbare Methoden für 2 Objekte zur Verfügung und bekommt dazu 2 protected Referenzen als Klassenvariablen.<br />
In den Konstruktoren der speziellen abgeleiteten Klassen werden diese dann initialisiert.<br />
Der Compiler meckert nun aber, dass in der abstrakten Basisklasse die Referenzen nicht initialisiert sind. Und er hat ja auch recht, falls man dieses in den abgeleiteten Klassen vergisst!<br />
Ich hatte allerdings gehofft, er erkennt, dass es sich um eine abstrakte Klasse handelt, die nicht instanziiert werden kann und prüft dann die Initialisierung nur in den abgeleiteten Klassen!<br />
Also die Verwendbarkeit von Referenzen scheint mir doch sehr stark eingeschränkt! Worin liegt denn der Vorteil gegenüber Zeigern?</p>
<p>Hier mal etwas Bsp.-Code, vielleicht ist ja das ganze Konzept von mir nicht so glücklich:</p>
<pre><code class="language-cpp">// Abstrakte Klasse
#ifndef USERACTIVITY_H
#define USERACTIVITY_H

#include &quot;ActivityC.h&quot;
#include &quot;AnimObjectC.h&quot;
#include &quot;PlayerC.h&quot;

class UserActivityC : public ActivityC
{
	public:
        UserActivityC();
        virtual ~UserActivityC() = 0;

    protected:
    	void changeCursorObject(const int type);

    private:
    	AnimObjectC&amp; cursor;
    	PlayerC&amp; humanPlayer;
};
#endif

// Implementierung
#include &quot;UserActivityC.h&quot;

UserActivityC::UserActivityC()
{
}

UserActivityC::~UserActivityC() {}

void UserActivityC::changeCursorObject(const int type)
{
	cursor.setActiveAnimationType(type);
	cursor.toggleVisible();
}

// Spezielle Klasse
#ifndef TOWERGADGETACTIVITY_H
#define TOWERGADGETACTIVITY_H

#include &quot;UserActivityC.h&quot;
#include &quot;AnimObjectC.h&quot;
#include &quot;PlayerC.h&quot;

class TowerGadgetActivityC : public UserActivityC
{
	public:
        TowerGadgetActivityC(AnimObjectC&amp; cursorObject, PlayerC&amp; human);
        ~TowerGadgetActivityC();

        void activate();
};
#endif

// Implementierung
#include &quot;TowerGadgetActivityC.h&quot;

TowerGadgetActivityC::TowerGadgetActivityC(AnimObjectC&amp; cursorObject, PlayerC&amp; human) : cursor(cursorObject), humanPlayer(human)
{
}

TowerGadgetActivityC::~TowerGadgetActivityC() {}

void TowerGadgetActivityC::activate()
{
	changeCursorObject(GFX_TOWERCURSOR);
}
</code></pre>
<p>Kann ich in solchen Fällen denn nur mit Zeigern arbeiten? Oder gibt es noch andere Möglichkeiten?</p>
<p>Vielen Dank schon einmal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268420/referenzen-in-abstrakten-und-davon-abgeleiteten-klassen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 21:04:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268420.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Jun 2010 20:08:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenzen in abstrakten und davon abgeleiteten Klassen on Tue, 08 Jun 2010 20:08:33 GMT]]></title><description><![CDATA[<p>Hallo mal wieder,</p>
<p>bin gerade ziemlich gefrustet, denn so langsam aber sicher bringt mich das Referenzkonzept von C++ um! Die Sprache ist doch schon komplex und schwierig genug!</p>
<p>Hatte mir folgendes überlegt:</p>
<p>Eine abstrakte Basisklasse stellt wiederverwendbare Methoden für 2 Objekte zur Verfügung und bekommt dazu 2 protected Referenzen als Klassenvariablen.<br />
In den Konstruktoren der speziellen abgeleiteten Klassen werden diese dann initialisiert.<br />
Der Compiler meckert nun aber, dass in der abstrakten Basisklasse die Referenzen nicht initialisiert sind. Und er hat ja auch recht, falls man dieses in den abgeleiteten Klassen vergisst!<br />
Ich hatte allerdings gehofft, er erkennt, dass es sich um eine abstrakte Klasse handelt, die nicht instanziiert werden kann und prüft dann die Initialisierung nur in den abgeleiteten Klassen!<br />
Also die Verwendbarkeit von Referenzen scheint mir doch sehr stark eingeschränkt! Worin liegt denn der Vorteil gegenüber Zeigern?</p>
<p>Hier mal etwas Bsp.-Code, vielleicht ist ja das ganze Konzept von mir nicht so glücklich:</p>
<pre><code class="language-cpp">// Abstrakte Klasse
#ifndef USERACTIVITY_H
#define USERACTIVITY_H

#include &quot;ActivityC.h&quot;
#include &quot;AnimObjectC.h&quot;
#include &quot;PlayerC.h&quot;

class UserActivityC : public ActivityC
{
	public:
        UserActivityC();
        virtual ~UserActivityC() = 0;

    protected:
    	void changeCursorObject(const int type);

    private:
    	AnimObjectC&amp; cursor;
    	PlayerC&amp; humanPlayer;
};
#endif

// Implementierung
#include &quot;UserActivityC.h&quot;

UserActivityC::UserActivityC()
{
}

UserActivityC::~UserActivityC() {}

void UserActivityC::changeCursorObject(const int type)
{
	cursor.setActiveAnimationType(type);
	cursor.toggleVisible();
}

// Spezielle Klasse
#ifndef TOWERGADGETACTIVITY_H
#define TOWERGADGETACTIVITY_H

#include &quot;UserActivityC.h&quot;
#include &quot;AnimObjectC.h&quot;
#include &quot;PlayerC.h&quot;

class TowerGadgetActivityC : public UserActivityC
{
	public:
        TowerGadgetActivityC(AnimObjectC&amp; cursorObject, PlayerC&amp; human);
        ~TowerGadgetActivityC();

        void activate();
};
#endif

// Implementierung
#include &quot;TowerGadgetActivityC.h&quot;

TowerGadgetActivityC::TowerGadgetActivityC(AnimObjectC&amp; cursorObject, PlayerC&amp; human) : cursor(cursorObject), humanPlayer(human)
{
}

TowerGadgetActivityC::~TowerGadgetActivityC() {}

void TowerGadgetActivityC::activate()
{
	changeCursorObject(GFX_TOWERCURSOR);
}
</code></pre>
<p>Kann ich in solchen Fällen denn nur mit Zeigern arbeiten? Oder gibt es noch andere Möglichkeiten?</p>
<p>Vielen Dank schon einmal!</p>
<p>Ciao</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1909192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1909192</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 08 Jun 2010 20:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in abstrakten und davon abgeleiteten Klassen on Tue, 08 Jun 2010 20:12:52 GMT]]></title><description><![CDATA[<p>Auf das übliche Base/Derived-Beispiel (bin zu faul deine Klassen zu übernehmen <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>
<pre><code class="language-cpp">class Base {
    Identifier&amp; ref;
public:
    Base(Identifier&amp; id)
     : ref(id)  // Elementinitialisierer notwendig
    {}
};

class Derived : public Base {
public:
    Derived(Identifier&amp; id)
     : Base(id)  // Basisinitialisierer notwendig
    {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1909196</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1909196</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 08 Jun 2010 20:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in abstrakten und davon abgeleiteten Klassen on Tue, 08 Jun 2010 20:16:57 GMT]]></title><description><![CDATA[<p>Genau so hatte ich es in einer ersten Version auch. Das hat zwar mit dem Kompilieren geklappt, leider gab es zur Laufzeit Probleme!<br />
Bin allerdings nicht dazu gekommen rauszufinden, wieso, da ich noch keine Möglichkeit gefunden hatte zu prüfen,<br />
ob die Referenzvariablen überall auf die gleichen Objekte verweisen (s. mein anderer Thread dazu).</p>
<p>Dann halt wieder zurück und dort den Fehler weiter suchen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1909198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1909198</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Tue, 08 Jun 2010 20:16:57 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in abstrakten und davon abgeleiteten Klassen on Tue, 08 Jun 2010 20:29:11 GMT]]></title><description><![CDATA[<p>Das Objekt, welches du referenzierst, muss aber mindestens genauso lange leben, wie das Objekt, das die Referenz hält! Kann es sein, dass du irgendwie sowas gemacht hast?</p>
<pre><code class="language-cpp">class DerivedUser {
    Derived d;
public:
    void funny() {
      Identifier id;
      d = Derived(id);
    }  // hier ist id zerstört, die Referenz in Derived ungültig
};
</code></pre>
<p>edit:<br />
Beiespiel war doof, geändet <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/1909200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1909200</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 08 Jun 2010 20:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen in abstrakten und davon abgeleiteten Klassen on Thu, 10 Jun 2010 16:26:36 GMT]]></title><description><![CDATA[<p>So nun endlich mal meine Antwort.</p>
<p>Mein Fehler war, dass eine Referenz keinen gültigen Wert erhalten hatte. Der Grund dafür ist, dass beim Aufruf des Konstruktors für beide Referenzvariablen jeweils ein Zeiger auf eines der Objekte in der aufrufenden Klasse dereferenziert wird.<br />
Nun hatte aber einer der Zeiger noch nicht auf ein gültiges Objekt gezeigt (war noch nicht angelegt). Das führte zu dem Fehler!</p>
<p>Vielen Dank nochmal für eure Hilfen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1910172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1910172</guid><dc:creator><![CDATA[Reth]]></dc:creator><pubDate>Thu, 10 Jun 2010 16:26:36 GMT</pubDate></item></channel></rss>