<?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[Durchreichen von Attributen bei Composition]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich stehe vor etwa folgendem Problem:</p>
<p>Von 2 Templates wurden 2 Klassen A und B vererbt. Das TemplateB verwaltet dabei die Objekte des TemplatesA. In A wurden zusätzlich zu TemplateA Funktionen implementiert, in B zusätzliche Funktionen zu TemplateB. Das gleiche gilt für C und D, welche sich gegenüber A und B in den Membervariablen und –funktionen unterscheiden.<br />
Die Klasse E enthält jeweils ein Objekt der Klassen B und D und verwaltet diese. Zudem enthält sie Werte (z.B. Dichte, etc.) die für B und D gelten.</p>
<p>Ich möchte nun einen Wert von E an A durchreichen. Leider habe ich nirgends gelesen, wie das „Upcasten“ im Falle von Composition möglich ist. Hier habe ich schematisch meinen Versuch abgebildet: Ich habe die class E als friend class von class A definiert und versucht in der Funktion setWertA() auf die Werte der class E mittels der Funktion getWertE() zuzugreifen.</p>
<p>Allerdings tauchen beim Kompilieren folgende Fehlermeldungen auf:</p>
<p>error: ’A’ was not declared in this scope<br />
error: template argument 1 is invalid<br />
error: ISO C++ forbids declaration of ‘A’ with no type</p>
<p>Wie könnte ich den wertE an die class A durchreichen?</p>
<p>Vielen Dank!</p>
<pre><code>[cpp]

class TemplateA;
class TemplateB;

class A : public TemplateA
{
    private:
         bool wertA;

         friend classE;

    public:
         void setWertA(E&amp; data) 
         { 
              if (data.getWertE() &gt;= 10)
              {
                  wertA = true; 
              }
              else
              {
                  wertA = false;
              }
         }
}

class B : public TemplateB
{
    ...;
}

class C : public TemplateA
{
    …;
}

class D : public TemplateB
{
    ...;
}

class E
{
    private:
        int wertE;

    public:
        B memClassB;
        D memClassD;

        const int&amp; getWertE() const { return wertE; }
}

main
{
    ...;
}

[/cpp]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/264432/durchreichen-von-attributen-bei-composition</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 21:12:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/264432.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Apr 2010 14:56:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Durchreichen von Attributen bei Composition on Wed, 07 Apr 2010 14:56:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich stehe vor etwa folgendem Problem:</p>
<p>Von 2 Templates wurden 2 Klassen A und B vererbt. Das TemplateB verwaltet dabei die Objekte des TemplatesA. In A wurden zusätzlich zu TemplateA Funktionen implementiert, in B zusätzliche Funktionen zu TemplateB. Das gleiche gilt für C und D, welche sich gegenüber A und B in den Membervariablen und –funktionen unterscheiden.<br />
Die Klasse E enthält jeweils ein Objekt der Klassen B und D und verwaltet diese. Zudem enthält sie Werte (z.B. Dichte, etc.) die für B und D gelten.</p>
<p>Ich möchte nun einen Wert von E an A durchreichen. Leider habe ich nirgends gelesen, wie das „Upcasten“ im Falle von Composition möglich ist. Hier habe ich schematisch meinen Versuch abgebildet: Ich habe die class E als friend class von class A definiert und versucht in der Funktion setWertA() auf die Werte der class E mittels der Funktion getWertE() zuzugreifen.</p>
<p>Allerdings tauchen beim Kompilieren folgende Fehlermeldungen auf:</p>
<p>error: ’A’ was not declared in this scope<br />
error: template argument 1 is invalid<br />
error: ISO C++ forbids declaration of ‘A’ with no type</p>
<p>Wie könnte ich den wertE an die class A durchreichen?</p>
<p>Vielen Dank!</p>
<pre><code>[cpp]

class TemplateA;
class TemplateB;

class A : public TemplateA
{
    private:
         bool wertA;

         friend classE;

    public:
         void setWertA(E&amp; data) 
         { 
              if (data.getWertE() &gt;= 10)
              {
                  wertA = true; 
              }
              else
              {
                  wertA = false;
              }
         }
}

class B : public TemplateB
{
    ...;
}

class C : public TemplateA
{
    …;
}

class D : public TemplateB
{
    ...;
}

class E
{
    private:
        int wertE;

    public:
        B memClassB;
        D memClassD;

        const int&amp; getWertE() const { return wertE; }
}

main
{
    ...;
}

[/cpp]
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1878910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878910</guid><dc:creator><![CDATA[rickie]]></dc:creator><pubDate>Wed, 07 Apr 2010 14:56:07 GMT</pubDate></item><item><title><![CDATA[Reply to Durchreichen von Attributen bei Composition on Wed, 07 Apr 2010 15:26:03 GMT]]></title><description><![CDATA[<p>Ich glaube du denkst da viel zu kompliziert. Du brauchst bloß mal deine Abhängigkeiten richtig zu ordnen:</p>
<pre><code class="language-cpp">class TemplateA{};
class TemplateB{};

class B : public TemplateB
{
};

class C : public TemplateA
{
};

class D : public TemplateB
{
};

class E
{
    private:
        int wertE;

    public:
        B memClassB;
        D memClassD;

        const int&amp; getWertE() const { return wertE; }
};

class A : public TemplateA
{
    private:
         bool wertA;

    public:
         void setWertA(E&amp; data)
         {
              if (data.getWertE() &gt;= 10)
              {
                  wertA = true;
              }
              else
              {
                  wertA = false;
              }
         }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1878941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878941</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 07 Apr 2010 15:26:03 GMT</pubDate></item><item><title><![CDATA[Reply to Durchreichen von Attributen bei Composition on Wed, 07 Apr 2010 16:53:33 GMT]]></title><description><![CDATA[<p>Danke für die rasche Antwort!</p>
<p>Ich hätte noch zwei Fragen:</p>
<p>Sind beide Funktionen f() und g() möglich, d.h. kann ich sowohl auf die private als auch die public Variablen zugreifen?</p>
<pre><code>[cpp]
class A
{
  private:
     int prWert;
  public:
     int puWert;
}

class B
{
   private:
     int Wert;
   public:
     A a;
     void f() { Wert = a.prWert ; }
     void g() { Wert = a.puWert ; }
}
[/cpp]
</code></pre>
<p>Macht es einen Unterschied ob ich A als friend class in private oder public definiere? Welche der Funktionen v() bis y() sind gültig?</p>
<pre><code>[cpp]
class A
{
  private:
     int Wert;
     void v() { Wert = B::prWert ; }
     void w() { Wert = B::puWert ; }
     void x() { Wert = C::prWert ; }
     void y() { Wert = C::puWert ; }
}

class B
{
  private:
     int prWert;
     friend class A;
  public:
     int puWert;
}

class C
{
  private:
     int prWert;
  public:
     friend class A;
     int puWert;
}
[/cpp]
</code></pre>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1878982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1878982</guid><dc:creator><![CDATA[rickie]]></dc:creator><pubDate>Wed, 07 Apr 2010 16:53:33 GMT</pubDate></item><item><title><![CDATA[Reply to Durchreichen von Attributen bei Composition on Wed, 07 Apr 2010 18:45:21 GMT]]></title><description><![CDATA[<p>rickie schrieb:</p>
<blockquote>
<p>Sind beide Funktionen f() und g() möglich, d.h. kann ich sowohl auf die private als auch die public Variablen zugreifen?</p>
</blockquote>
<p>Selbstverständlich kannst du nicht auf private Elemente zugreifen. Private ist ja gerade dazu da, um das zu verhindern.</p>
<blockquote>
<p>Macht es einen Unterschied ob ich A als friend class in private oder public definiere? Welche der Funktionen v() bis y() sind gültig?</p>
</blockquote>
<p>Friend funktioniert genau andersrum wie du denkst. Daher sind nur w() und y() gültig. Damit v oder z funktionieren müsste die Klasse A die Klassen B bzw. C als friend haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879006</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 07 Apr 2010 18:45:21 GMT</pubDate></item><item><title><![CDATA[Reply to Durchreichen von Attributen bei Composition on Thu, 08 Apr 2010 06:41:39 GMT]]></title><description><![CDATA[<p>Danke für die Klarstellungen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1879132</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1879132</guid><dc:creator><![CDATA[rickie]]></dc:creator><pubDate>Thu, 08 Apr 2010 06:41:39 GMT</pubDate></item></channel></rss>