<?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[[nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei]]></title><description><![CDATA[<p>Ich habe das Problem, dass ich in einer Klassendefinition innerhalb einer Headerdatei eine Variable definieren will, die ein Objekt aus einer fremden Datei ist.</p>
<p>Folgender Code ist auf das notwendigste reduziert dargestellt:</p>
<p>scene.h</p>
<pre><code>class Scene
{
    //CODE

    //Panels
    Panel bg_;

    //CODE
};
</code></pre>
<p>panel.h</p>
<pre><code>#include &quot;SDL/SDL.h&quot;        // domain SDL function
#include &quot;SDL/SDL_opengl.h&quot; // OpenGl commands
#include &quot;SDL/SDL_image.h&quot;  // SDL_image functions
#include &lt;iostream&gt;
#include &lt;string&gt;

class Panel
{
    float xPos_;
    float yPos_;
    float width_;
    float height_;
    int alpha_;

    unsigned int texture_;
    bool draw_;

    public:
        Panel(float x,float y,float w, float h);
        Panel(float x,float y,float w, float h, bool draw);
        Panel(float x,float y,float w, float h, const std::string &amp;fileName);
        Panel(float x,float y,float w, float h, const std::string &amp;fileName, bool draw);

        bool draw();
        void setAlpha(int alpha);
        void setTexture(const std::string &amp;fileName);
};
</code></pre>
<p>Da panel.h erst in der Datei scene.cpp inkludiert wird, ist es klar, dass der Compiler die Klasse in der scene.h noch nicht kennt und folgende Fehlermeldung erscheint:</p>
<blockquote>
<p>data/scene.h:20: error: ‘Panel’ does not name a type</p>
</blockquote>
<p>Gibt es eine elegante Möglichkeit, das Problem zu umgehen?<br />
Die Variable muss bereits in der Klassendefinition enthalten sein, da Funktionen der Klasse innerhalb einer Schleife abgerufen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287285/nicht-mehr-aktuell-variablen-für-fremdklasse-in-header-datei</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 13:06:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287285.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 25 May 2011 17:34:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Mon, 29 Aug 2011 22:36:17 GMT]]></title><description><![CDATA[<p>Ich habe das Problem, dass ich in einer Klassendefinition innerhalb einer Headerdatei eine Variable definieren will, die ein Objekt aus einer fremden Datei ist.</p>
<p>Folgender Code ist auf das notwendigste reduziert dargestellt:</p>
<p>scene.h</p>
<pre><code>class Scene
{
    //CODE

    //Panels
    Panel bg_;

    //CODE
};
</code></pre>
<p>panel.h</p>
<pre><code>#include &quot;SDL/SDL.h&quot;        // domain SDL function
#include &quot;SDL/SDL_opengl.h&quot; // OpenGl commands
#include &quot;SDL/SDL_image.h&quot;  // SDL_image functions
#include &lt;iostream&gt;
#include &lt;string&gt;

class Panel
{
    float xPos_;
    float yPos_;
    float width_;
    float height_;
    int alpha_;

    unsigned int texture_;
    bool draw_;

    public:
        Panel(float x,float y,float w, float h);
        Panel(float x,float y,float w, float h, bool draw);
        Panel(float x,float y,float w, float h, const std::string &amp;fileName);
        Panel(float x,float y,float w, float h, const std::string &amp;fileName, bool draw);

        bool draw();
        void setAlpha(int alpha);
        void setTexture(const std::string &amp;fileName);
};
</code></pre>
<p>Da panel.h erst in der Datei scene.cpp inkludiert wird, ist es klar, dass der Compiler die Klasse in der scene.h noch nicht kennt und folgende Fehlermeldung erscheint:</p>
<blockquote>
<p>data/scene.h:20: error: ‘Panel’ does not name a type</p>
</blockquote>
<p>Gibt es eine elegante Möglichkeit, das Problem zu umgehen?<br />
Die Variable muss bereits in der Klassendefinition enthalten sein, da Funktionen der Klasse innerhalb einer Schleife abgerufen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068620</guid><dc:creator><![CDATA[Ki]]></dc:creator><pubDate>Mon, 29 Aug 2011 22:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 17:35:46 GMT]]></title><description><![CDATA[<p>panel.h einbinden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068623</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 May 2011 17:35:46 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 17:45:07 GMT]]></title><description><![CDATA[<p>Schande über mein Haupt... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>EDIT</p>
<p>Und wie regle ich das dann mit dem Konstruktor?<br />
Panel::Panel() ist nicht als Konstruktor vorhanden. Oder kann ein zuvor definiertes Objekt so einfach neu definiert werden, wenn ich den Konstruktor Panel::Panel() erstellt habe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068627</guid><dc:creator><![CDATA[Ki]]></dc:creator><pubDate>Wed, 25 May 2011 17:45:07 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 17:54:02 GMT]]></title><description><![CDATA[<p>Ki schrieb:</p>
<blockquote>
<p>Und wie regle ich das dann mit dem Konstruktor?<br />
Panel::Panel() ist nicht als Konstruktor vorhanden.</p>
</blockquote>
<p>Dann wirst du wohl eine Initiaslisierungliste im Konstruktor von Scene brauchen.</p>
<blockquote>
<p>Oder kann ein zuvor definiertes Objekt so einfach neu definiert werden, wenn ich den Konstruktor Panel::Panel() erstellt habe?</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> Du willst Panel einen Standardkonstruktor hinzufügen? Das ginge zwar technisch gesehen auch, erscheint mir aber wenig sinnvoll. Schließlich hat es ja sicherlich einen Grund, warum Panel derzeit keinen hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068637</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 May 2011 17:54:02 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 18:08:47 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Du willst Panel einen Standardkonstruktor hinzufügen? Das ginge zwar technisch gesehen auch, erscheint mir aber wenig sinnvoll. Schließlich hat es ja sicherlich einen Grund, warum Panel derzeit keinen hat.</p>
</blockquote>
<p>Damit hast du Recht. Außerdem scheint es so, als müsste ich die Werte dann über Setter nachträglich ändern.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Dann wirst du wohl eine Initiaslisierungliste im Konstruktor von Scene brauchen.</p>
</blockquote>
<p>Wie stelle ich das an, ohne die Objekte nur für den Konstruktor (sondern für die gesamte Klasse) zu erstellen?</p>
<p>Außerdem würde ich die eigentliche Definition gern innerhalb einer Funktion durchführen:</p>
<pre><code>bool Scene::preScene(SDL_Event event)
{
    if (!texLoaded_)
    {
        std::cout &lt;&lt; &quot;Load Textures!&quot; &lt;&lt; std::endl;
        Panel bg_(0,0,WINDOW_WIDTH_,WINDOW_HEIGHT_,&quot;data/graphic/prescene/prescene_naudiz.png&quot;);

        texLoaded_ = true;
        std::cout &lt;&lt; &quot;Textures Loaded!&quot; &lt;&lt; std::endl;
    }

    //CODE
}
</code></pre>
<p>Die Funktion wird, wie bereits erwähnt, innerhalb eines Loops aufgerufen.</p>
<p>Mit der if-Abfrage will ich wiederum eine einmalige Definition bezwecken.</p>
<p>Neben bool Scene::preScene(SDL_Event event) sollen auch noch andere Funktionen dieser Art innerhalb des Loops aufgerufen werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068647</guid><dc:creator><![CDATA[Ki]]></dc:creator><pubDate>Wed, 25 May 2011 18:08:47 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 18:17:47 GMT]]></title><description><![CDATA[<p>Bevor wir hier total aneinander vorbeireden: Dir ist klar, was eine Initialisierungsliste ist, wozu sie gut ist und wie die Syntax ausschaut?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068650</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 May 2011 18:17:47 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 18:22:52 GMT]]></title><description><![CDATA[<p>Auch nach intensivem Googeln nicht wirklich, daher meine Nachfrage, aber hätte auf etwas in diese Richtung getippt:</p>
<pre><code>Panel::Panel(float x,float y,float w, float h) :
[b]xPos_(x), yPos_(y), width_(w), height_(h)[/b]
{
    draw_ = true;
    texture_ = 0;
    alpha_ = 255;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2068654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068654</guid><dc:creator><![CDATA[Ki]]></dc:creator><pubDate>Wed, 25 May 2011 18:22:52 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 18:28:03 GMT]]></title><description><![CDATA[<p>Du hast doch ein Problem mit der Scene-Klasse, also mußt du auch in deren Konstruktor eine Initialisierungsliste verwenden.</p>
<p>Wenn du die Werte des Panels erst nach dem Anlegen der Scene erfährst, mußt du die Panel-Klasse so ausbauen, daß du ihre Werte zur Laufzeit ändern kannst, andernfalls setzt du die Parameter im Scene-Konstruktor und nutzt sie anschließend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068658</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 25 May 2011 18:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 18:34:29 GMT]]></title><description><![CDATA[<p>Man sollte noch anmerken, dass es durchaus möglich ist, während der Initialisierungsliste Klassenmethoden aufzurufen, wenn diese nur Member benutzen, die zu der Zeit schon initialisiert sind. So könntest du eine Methode zum Laden einer Szene benutzen, die dir dann die Werte zum Initialisieren des Panels liefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068663</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 25 May 2011 18:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Wed, 25 May 2011 18:36:54 GMT]]></title><description><![CDATA[<p>CStoll schrieb:</p>
<blockquote>
<p>Wenn du die Werte des Panels erst nach dem Anlegen der Scene erfährst, mußt du die Panel-Klasse so ausbauen, daß du ihre Werte zur Laufzeit ändern kannst, andernfalls setzt du die Parameter im Scene-Konstruktor und nutzt sie anschließend.</p>
</blockquote>
<p>Heißt im Klartext:<br />
Objekte schon vor dem Loop leer definieren, deklarieren und die Attribute im Loop per Setter verändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2068664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068664</guid><dc:creator><![CDATA[Ki]]></dc:creator><pubDate>Wed, 25 May 2011 18:36:54 GMT</pubDate></item><item><title><![CDATA[Reply to [nicht mehr aktuell] Variablen für Fremdklasse in Header-Datei on Thu, 26 May 2011 06:44:43 GMT]]></title><description><![CDATA[<p>Ki schrieb:</p>
<blockquote>
<p>Heißt im Klartext:<br />
Objekte schon vor dem Loop leer definieren, deklarieren und die Attribute im Loop per Setter verändern?</p>
</blockquote>
<p>Bisher war von einem Loop nie die Rede, es ging nur um den Scene-Konstruktor. Klartext ist also was völlig anderes.</p>
<p>Klartext: Wenn deine Scene-Objekte ein Panel-Objekt als Member haben, wird das Panel-Objekt <em>auf jeden Fall</em> im Konstruktor des Scene-Objektes initialisiert, und zwar vor Betreten des Scene-Konstruktor-Bodys. Das heißt:</p>
<pre><code class="language-cpp">Scene::Scene(/* params */)
  //Hier wird AUF JEDEN FALL der Konstruktor von bg_ aufgerufen
{
}
</code></pre>
<p>Das passiert entweder implizit (d.h. der Default-Ctor von Panel wird aufgerufen) oder explizit (per Initialisierungsliste). Da Panel keinen Default-Ctor hat, gehts nur explizit, also so:</p>
<pre><code class="language-cpp">Scene::Scene(/* params */)
  : bg_(someX(), someY(), someW(), someH())
{
}
</code></pre>
<p>Dabei gibts Beschränkungen für das, was du bg_ für die Initialisierung übergeben darfst:<br />
- Die Werte dürfen von den Parametern des Scene-Konstruktors abhängen<br />
- Die Werte dürfen von allen Scene-Membern abhängen, die vor bg_ in der Liste der Klassenmember stehen (weil die vor bg_ initialisiert wurden.<br />
- Die Werte dürfen <strong>nicht</strong> von Membern abhängen, die weiter unten in der Memberliste stehen.<br />
Für die initialisierung darfst du alle möglichen Funktionen benutzen, sofern die nicht welche von den &quot;späteren&quot; Membern benutzen oder das Scene-Objekt als ganzes.</p>
<p>Die Definition der Panel-Klasse, die du gezeigt hast, erlaubt übrigens noch was anderes:</p>
<pre><code class="language-cpp">Panel giveMeAPanel(/* params */);

Scene::Scene(/* params */)
  : bg_(giveMeAPanel) //copy-Ctor von Panel aufgerufen
{
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2068840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2068840</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 26 May 2011 06:44:43 GMT</pubDate></item></channel></rss>