<?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[Variablen einer Basisklasse ansprechen]]></title><description><![CDATA[<p>Weis jemand warum das nicht funktioniert?<br />
Ich glaube es liegt daran das ich templates benutze.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class IFoo
{
    protected:
        T _data;
        int _size;
};

template&lt;class T&gt;
class Foo:public IFoo&lt;T&gt;
{
    public:
        Foo()
        :_data(10);
        {
            _size=0;
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/247274/variablen-einer-basisklasse-ansprechen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 14:57:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247274.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 08 Aug 2009 17:02:11 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:02:11 GMT]]></title><description><![CDATA[<p>Weis jemand warum das nicht funktioniert?<br />
Ich glaube es liegt daran das ich templates benutze.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class IFoo
{
    protected:
        T _data;
        int _size;
};

template&lt;class T&gt;
class Foo:public IFoo&lt;T&gt;
{
    public:
        Foo()
        :_data(10);
        {
            _size=0;
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1757476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757476</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:02:11 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:09:42 GMT]]></title><description><![CDATA[<p>Das liegt nicht an den Templates, sondern daran dass _data kein Member der Klass Foo ist.<br />
In der Initialisierungsliste dürfen nur Member der eigenen Klass stehen (und der Basis Klassen- Konstruktoraufruf).</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757481</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:13:24 GMT]]></title><description><![CDATA[<p>Ok lassen wir die Initialisierungsliste mal weg. Dann funktioniert es immer noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757484</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:15:59 GMT]]></title><description><![CDATA[<p>So, und was für eine Fehlermeldung erhälst Du? Und was für ein Compiler verwendest Du?</p>
<p>Edit: Und wie sieht der Code aus, der Foo benutzt?</p>
<p>Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757486</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:15:59 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:16:35 GMT]]></title><description><![CDATA[<p>Oh natürlich mein Compiler ist Code::Blocks 8.02 und die Fehlermeldung lautet:<br />
E:\C++\Library\Vector.h|63|error: `_data' was not declared in this scope|</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757487</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:16:35 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:20:39 GMT]]></title><description><![CDATA[<p>K ich poste mal nen Auszug aus meinen Code.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class IVector
{
    protected:
        T* _data;
        int _size;
        static const int GROW_SIZE=10;
};
template&lt;class T&gt;
class Vector:public IVector&lt;T&gt;
{
    public:
        ~Vector(){delete[] _data;}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1757489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757489</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:20:39 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:23:40 GMT]]></title><description><![CDATA[<p>Mit VS2008 SP1 kompiliert der Code anstandslos.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757494</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:23:40 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:25:13 GMT]]></title><description><![CDATA[<p>_data ist in deinem ersten Beispiel vom Typ T, was bringt da der Versuch _data auf 10 (was ja ein integraler Typ ist) zu setzen?<br />
Und in deinem 2ten Beispiel sollte</p>
<pre><code class="language-cpp">delete[] this-&gt;_data;
</code></pre>
<p>klappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757495</guid><dc:creator><![CDATA[Orakel-Joe]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:25:13 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:26:31 GMT]]></title><description><![CDATA[<p>Hmm das ist blöd, weis jemand warum es bei Code::Block 8.02 nicht funktioniert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757496</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:26:31 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:26:41 GMT]]></title><description><![CDATA[<p>Schreib einfach this-&gt;_data. Der Compiler sucht sonst im globalen Scope nach _data, weil er nicht weiß, mit welchem T Vector tatsächlich instantiiert wird, er kennt also die Klasse, von der abgeleitet wird, noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757498</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:26:41 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:28:02 GMT]]></title><description><![CDATA[<p>[quote=&quot;Orakel-Joe&quot;]_data ist in deinem ersten Beispiel vom Typ T, was bringt da der Versuch _data auf 10 (was ja ein integraler Typ ist) zu setzen?</p>
<p>Ja sry sollte nur ein Beispiel sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757500</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:28:02 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:29:56 GMT]]></title><description><![CDATA[<p>Ryuzaki schrieb:</p>
<blockquote>
<p>Schreib einfach this-&gt;_data. Der Compiler sucht sonst im globalen Scope nach _data, weil er nicht weiß, mit welchem T Vector tatsächlich instantiiert wird, er kennt also die Klasse, von der abgeleitet wird, noch nicht.</p>
</blockquote>
<p>Ah ok merci. Kann ich die Klasse auch irgendwie bekannt machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757501</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757501</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:29:56 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:33:13 GMT]]></title><description><![CDATA[<p>Gast123 schrieb:</p>
<blockquote>
<p>Ah ok merci. Kann ich die Klasse auch irgendwie bekannt machen?</p>
</blockquote>
<p>Mir ist keine Möglichkeit bekannt. Ein kurzes this ist doch aber kein Beinbruch, oder?<br />
Abgesehen davon würde ich das Design ändern. Warum ist Vector für Variablen von IVector verantwortlich? Macht für mich nicht viel Sinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757502</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:33:13 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:40:29 GMT]]></title><description><![CDATA[<p>Ryuzaki schrieb:</p>
<blockquote>
<p>Gast123 schrieb:</p>
<blockquote>
<p>Ah ok merci. Kann ich die Klasse auch irgendwie bekannt machen?</p>
</blockquote>
<p>Mir ist keine Möglichkeit bekannt. Ein kurzes this ist doch aber kein Beinbruch, oder?</p>
</blockquote>
<p>Ja aber ich will nicht jedes mal einen this-Zeiger benutzen,wenn ich eine Variable aus IFace nehme.</p>
<blockquote>
<p>Abgesehen davon würde ich das Design ändern. Warum ist Vector für Variablen von IVector verantwortlich? Macht für mich nicht viel Sinn.</p>
</blockquote>
<p>IVector ist bei die Schnittstelle die für die &quot;primitiven&quot; operationen verantwortlich ist(z.B. = oder +) und Vector hat bei mir die &quot;höheren&quot; opertionen &quot;wie z.B. grow() oder moveDown()&quot;, ich dacht das wär eine gute Idee, weil ich finde das so die Lesbarkeit erhöht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757507</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:40:29 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 17:49:43 GMT]]></title><description><![CDATA[<p>Meiner Meinung nach kann das alles in eine Klasse.<br />
Vllt. kannst du Algorithmen, die nur Zugriff auf die primitiven Operationen brauchen, als freie Funktion implementieren, um die Kapselung zu erhöhen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757512</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757512</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Sat, 08 Aug 2009 17:49:43 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 18:01:22 GMT]]></title><description><![CDATA[<p>K ich hab jetzt nur noch eine Frage.<br />
Kann man Vector die Klasse IVector irgendwie bekannt machen, so dass ich nicht immer den this-Zeiger benutzen muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757524</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 18:01:22 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 18:06:36 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

template&lt;typename T&gt;
class base
{
    protected:
        T data;
};

template&lt;typename T&gt;
class derived : public base&lt;T&gt;
{
    using base&lt;T&gt;::data;
    public:
        void foo()
        {
            std::cout &lt;&lt; data;
        }
};

int main()
{
    derived&lt;int&gt; d;
    d.foo();
}
</code></pre>
<p>Kompiliert bei mir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757527</guid><dc:creator><![CDATA[Ryuzaki]]></dc:creator><pubDate>Sat, 08 Aug 2009 18:06:36 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 18:09:35 GMT]]></title><description><![CDATA[<p>Ah ok vielen Dank.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757530</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 18:09:35 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 18:38:19 GMT]]></title><description><![CDATA[<p>Ich spreche meine Variablen grundsätzlich mit &quot;Sie&quot; an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757545</guid><dc:creator><![CDATA[hmhmmmhmum]]></dc:creator><pubDate>Sat, 08 Aug 2009 18:38:19 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 18:44:25 GMT]]></title><description><![CDATA[<p>Wird es so aber nicht unübersichtlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757546</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 18:44:25 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 18:55:53 GMT]]></title><description><![CDATA[<p>Gibt es noch eine andere möglichkeit die Variablen einer abgeleiteten Klasse anzusprechen? Ich finde das using nicht so schön aussieht, besonders wenn die abgeleitete Klasse mehrere Variablen besitzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757547</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 18:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 21:47:37 GMT]]></title><description><![CDATA[<p>Du kannst die Member direkt über den <code>:: - Operator</code> ansprechen. Um an das Beispiel anzuhängen:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class derived : public base&lt;T&gt;
{
    //using base&lt;T&gt;::data;
    public:
        void foo()
        {
            std::cout &lt;&lt; base::data;
        }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1757637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757637</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sat, 08 Aug 2009 21:47:37 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 21:58:55 GMT]]></title><description><![CDATA[<p>Hmm ok es scheint wohl keine optimale Lösung zu geben, die eine Änderung der Klasse verhindert.</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class IFoo
{
    public:
        T _data;
};

template&lt;class T&gt;
class Foo:public IFoo&lt;T&gt;
{
    using IFoo::_data; //Das wollte ich vermeiden.
    public:
        Foo()
        {
            IFoo::_data; //Das wollte ich auch vermeiden.
            _data; //Dieser Zugriff wär mir am liebsten gewesen.
        }
};
</code></pre>
<p>So wie es aussieht muss ich bei dem Compiler Code::Blocks 8.02 immer wenn ich Klassen, die Templates benutzen, ableite, alle Variablen direkt ansprechen. Schade das ich den Compiler nicht sagen kann das diese Variablen in der Klasse IFoo sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757650</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 21:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 22:31:16 GMT]]></title><description><![CDATA[<p>@Gast123,<br />
1. Code::Blocks ist kein Kompiler, sondern eine IDE. Meistens wird dort der GCC als Kompiler verwendet, allerdings kann man mit Code::Blocks ohne grosse Probleme auch andere Kompiler verwenden. Das nur zur Klarstellung.<br />
2. Das Problem hat nichts mit dem Kompiler zu tun, sondern ist so im C++ Standard definiert. Das Problem ist, dass deine Basisklasse abhängig von einem Template Parameter ist. Dabei ist es unmöglich vor der Instanzierung der Templateklasse zu wissen, was für eine Basisklasse hier tatsächlich verwendet wird. Stichwort: Spezialisierung. Daher muss man dem Kompiler explizit mitteilen, dass er am entsprechenden Ort dann suchen soll. Kurzes Beispiel zur Verdeutlichung:</p>
<pre><code class="language-cpp">template&lt;typename&gt;
struct Base
{
  int a;
};

template&lt;&gt;
struct Base&lt;int&gt;
{
  // keine Variable.
};

int a; // globale Variable

template&lt;typename T&gt;
struct Derived
  : Base&lt;T&gt; // Was wird hier als Basisklasse genommen? Wir wissen es noch nicht!
{
  void foo()
  {
    std::cout &lt;&lt; a &lt;&lt; std::endl;
    // Es wird das falsche a verwendet, da wir noch nicht wissen,
    // welche Basisklasse verwendet werden wird. Im externen Scope
    // kann man allerdings bereits suchen, da dieser bekannt ist.
    // Deshalb wir hier das globale a verwendet.

    std::cout &lt;&lt; this-&gt;a &lt;&lt; std::endl;
    // Wir sagen dem Kompiler, dass es ein a in der Klasse geben muss.
    // Wenn dies nicht der Fall ist, wird es bei der Instanzierung der
    // Templateklasse zu einem Fehler kommen.

    std::cout &lt;&lt; Base&lt;T&gt;::a &lt;&lt; std::endl;
    // Grundsätzlich das gleiche wie oben, nur dass wir hier explizit
    // sagen, wo gesucht werden soll. Das ist übrigens ein wichtiger
    // Unterschied, betrifft vor allem das Aufrufen von Funktionen.
  }
};
</code></pre>
<p>3. Dein Design ist sehr fragwürdig. Die Lesbarkeit wird meiner Meinung nach definitiv nicht erhöht. Schon nur, weil du die Variablen nicht <code>private</code> machst. Du veränderst die Variablen direkt aus anderen Klassen heraus. Dadurch wird es völlig unmöglich irgendwelche Annahmen über die Variablen in der Basisklassen zu machen. Membervariablen sollten so gut wie immer <code>private</code> sein.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1757671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757671</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 08 Aug 2009 22:31:16 GMT</pubDate></item><item><title><![CDATA[Reply to Variablen einer Basisklasse ansprechen on Sat, 08 Aug 2009 22:45:19 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>@Gast123,<br />
1. Code::Blocks ist kein Kompiler, sondern eine IDE. Meistens wird dort der GCC als Kompiler verwendet, allerdings kann man mit Code::Blocks ohne grosse Probleme auch andere Kompiler verwenden. Das nur zur Klarstellung.</p>
</blockquote>
<p>Jo stimmt mein Fehler^^</p>
<blockquote>
<p>3. Dein Design ist sehr fragwürdig. Die Lesbarkeit wird meiner Meinung nach definitiv nicht erhöht. Schon nur, weil du die Variablen nicht <code>private</code> machst. Du veränderst die Variablen direkt aus anderen Klassen heraus. Dadurch wird es völlig unmöglich irgendwelche Annahmen über die Variablen in der Basisklassen zu machen. Membervariablen sollten so gut wie immer <code>private</code> sein.</p>
</blockquote>
<p>Hmm wahrscheinlich hast du recht, aber ich wollte das trotzdem mal wissen, weil ich dieses Wissen noch in anderen Projekten brauche.</p>
<p>Ok danke <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/1757680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1757680</guid><dc:creator><![CDATA[Gast123]]></dc:creator><pubDate>Sat, 08 Aug 2009 22:45:19 GMT</pubDate></item></channel></rss>