<?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[[gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend?]]></title><description><![CDATA[<p>Moin Leute,<br />
ich bin sehr unsicher, was eine friend- Klasse alles darf. Für die Zeile 18 &quot;teil::printTabHead();&quot; bekomme ich immer eine Fehlermeldung:<br />
&quot;E2283 Verwenden Sie . oder -&gt; zum Aufruf von 'teil::printTabHead()' in Funktion tverw::printTab()&quot;.<br />
Wie kann ich aus der Klasse 'tverw' die Methode 'printTabHead()' in der Klasse 'teil' aufrufen? Blöde Frage: Ist das überhaupt möglich?</p>
<pre><code>class teil
{
    friend class tverw;

    public:
    virual void printTabHead( void)
    {
        cout &lt;&lt; irgendwas;
    }
};

class tverw
{
    public:
    virtual void printTab( void )
      {
           teil::printTabHead();
      }
};
</code></pre>
<p>gelöst: Ich hab´ den entscheidenden Hinweis doch noch von Bjarne Stroustrup bekommen:</p>
<p>so muss es lauten, damit der Aufruf funktioniert:</p>
<pre><code>class teil
{
    friend class tverw;

    public:
    virual void printTabHead( void)
    {
        cout &lt;&lt; irgendwas;
    }
};

class tverw
{
    public:
    virtual void printTab( void )
      {
           // vorher: teil::printTabHead();
           teil* p_teil; // Zeiger auf Klasse 'teil' erstellen
           p_teil-&gt;printTabHead(); // mit Hilfe des Zeigers die Funktion aufrufen
      }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/170752/gelöst-aufruf-einer-basisklassenfunktion-früher-was-darf-friend</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 06:30:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/170752.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 19 Jan 2007 10:39:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 11:54:21 GMT]]></title><description><![CDATA[<p>Moin Leute,<br />
ich bin sehr unsicher, was eine friend- Klasse alles darf. Für die Zeile 18 &quot;teil::printTabHead();&quot; bekomme ich immer eine Fehlermeldung:<br />
&quot;E2283 Verwenden Sie . oder -&gt; zum Aufruf von 'teil::printTabHead()' in Funktion tverw::printTab()&quot;.<br />
Wie kann ich aus der Klasse 'tverw' die Methode 'printTabHead()' in der Klasse 'teil' aufrufen? Blöde Frage: Ist das überhaupt möglich?</p>
<pre><code>class teil
{
    friend class tverw;

    public:
    virual void printTabHead( void)
    {
        cout &lt;&lt; irgendwas;
    }
};

class tverw
{
    public:
    virtual void printTab( void )
      {
           teil::printTabHead();
      }
};
</code></pre>
<p>gelöst: Ich hab´ den entscheidenden Hinweis doch noch von Bjarne Stroustrup bekommen:</p>
<p>so muss es lauten, damit der Aufruf funktioniert:</p>
<pre><code>class teil
{
    friend class tverw;

    public:
    virual void printTabHead( void)
    {
        cout &lt;&lt; irgendwas;
    }
};

class tverw
{
    public:
    virtual void printTab( void )
      {
           // vorher: teil::printTabHead();
           teil* p_teil; // Zeiger auf Klasse 'teil' erstellen
           p_teil-&gt;printTabHead(); // mit Hilfe des Zeigers die Funktion aufrufen
      }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1212539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212539</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:54:21 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 10:40:52 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Wie kann ich aus der Klasse 'tverw' die Methode 'printTabHead()' in der Klasse 'teil' aufrufen?</p>
</blockquote>
<p>Du brauchst ein teil.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212541</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Fri, 19 Jan 2007 10:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 11:05:35 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">...
           teil::printTabHead();
...
</code></pre>
</blockquote>
<p>So darf man nur statische (oder Basisklassen-) Funktionen aufrufen ... und das ist sie in diesem Fall nicht (und kann hier wohl auch nicht zu einer gemacht werden).</p>
<p>erstmal musst Du klären, in welcher Beziehung &quot;tverw&quot; und &quot;Teil&quot; zueinander stehen:<br />
- Bekommt tverw ein Teil von Außen angeliefert:</p>
<pre><code class="language-cpp">class tverw
{
    public:
    virtual void printTab(Teil teil) //ggf. per (const)Referenz
      {
           // Druckt ein fremdes Teil aus
           teil.printTabHead();
      }
};
</code></pre>
<p>- Soll ein &quot;neues Teil&quot; ausgedruckt werden:</p>
<pre><code class="language-cpp">class tverw
{
    public:
    virtual void printTab() //ggf. per (const)Referenz
      {
           Teil teil; // Neues Teil, das nach Ende der Funktion wieder weg ist
           teil.printTabHead();
      }
};
</code></pre>
<p>- &quot;Hat&quot; tverw ein &quot;Teil&quot;</p>
<pre><code class="language-cpp">class tverw
{
    Teil teil;
    public:
    virtual void printTab()
      { // Druckt das eigene Teil aus
           teil.printTabHead();
      }
};
</code></pre>
<p>- Vielleicht sogar mehrere</p>
<pre><code class="language-cpp">class tverw
{
    std::vector&lt;Teil&gt; teile;
    public:
    virtual void printTab()
      { // Druckt das erste eigene Teil aus
           teile[0].printTabHead();
      }
};
</code></pre>
<p>- ....</p>
<p>In Deinem Fall hat das Ganze gar nichts mit &quot;friend&quot; zu tun, weil printTabHead() sowieso eine öffentliche Funktion ist, die JEDER aufrufen darf (der ein Teil in der Hand hat).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212559</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212559</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:05:35 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 11:40:21 GMT]]></title><description><![CDATA[<p>Ok, das verstehe ich. In 'tverw' wird erst ein &quot;Teil&quot; durch den Aufruf von</p>
<pre><code>tverw teile( DATFILE );
</code></pre>
<p>erstellt.<br />
Ich will also lieber, dass die class teil {}; eine abstrakte Basisklasse ist (Das sollte sie eigentlich sein). Wie stelle ich das an/ &quot;sage&quot; es den anderen Kassen? Gibt es wirklich gar keinen Weg, das so &quot;hinzubiegen&quot;?</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212584</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:40:21 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 11:59:28 GMT]]></title><description><![CDATA[<p>Wenn teil abstrakt sein soll, dann definiere es auch so:</p>
<pre><code class="language-cpp">class teil
{
public:
  virtual void print()=0;//abstrakte Methode - von Nachkommen definiert
};

class mutter : public teil
{
public:
  virtual void print()
  { cout &lt;&lt;&quot;Mutter:&quot;&lt;&lt;irgendwas; }
};

...
teil* pt = new mutter;
pt-&gt;print();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1212589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212589</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 19 Jan 2007 11:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 12:09:32 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>:<br />
pefekt! Das ist sozusagen das i-Tüpfelchen! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Danke Euch allen!</p>
<p>Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212597</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Fri, 19 Jan 2007 12:09:32 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 16:04:50 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>...<br />
Ich will also lieber, dass die class teil {}; eine abstrakte Basisklasse ist (Das sollte sie eigentlich sein)....</p>
</blockquote>
<p>Also ich muss sagen, dass ich das sanft anzweifele ... die Namensgeben lässt mich vermuten, dass es sich um &quot;Teil&quot; und um einen &quot;Teilverwalter&quot; handelt.<br />
Mit Vererbung (also &quot;Basisklasse&quot;) setzt man oft einen &quot;Ist-ein-&quot;-Beziehung um ... und &quot;Ist ein Teilverwalter ein Teil&quot; ?<br />
Wirklich ? Kann man mit dem Verwalter alles machen, was man mit dem Teil auch machen kann ?</p>
<p>Ich vermute eher, dass Du eine &quot;Hat-eine/mehrere&quot;-Beziehung zwischen beiden hast ... und die solltest Du über &quot;Aggregation&quot; umsetzen (s.o. &quot;Hat ein&quot;).<br />
Wenn Dein Problem ist, dass der Verwalter erst &quot;im Laufe seines Lebens&quot; Teile erzeugt, kannst Du sie in einem vector ablegen..</p>
<pre><code class="language-cpp">class tverw
{
    std::vector&lt;Teil&gt; teile;
    public:
    virtual void erzeugeTeil()
      { 
           teile.push_back(Teil());
      }
};
</code></pre>
<p>BTW: &quot;virtuelle Basisklassen&quot; sind wichtig bei Mehrfachvererbung (wenn also eine Klasse von unterschiedlichen Klassen erbt) .... ich glaube auch hier nicht, dass es das ist, was Du wirklich willst. <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>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212755</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212755</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 19 Jan 2007 16:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Fri, 19 Jan 2007 18:35:57 GMT]]></title><description><![CDATA[<p>Ob du es glaubst oder nicht, genau das ist es aber, was ich will... bzw. die Aufgabenstellung vorgibt. Klasse 'tverw' ist die einzige, die von außen aus der main() erreichbar/ benutzt werden soll. Diese fängt dann an, einzelne Teile (Klasse 'teil') aus einer von der main() angegebenen DatenDatei.</p>
<p>Trotzdem Danke für deine Hilfe, man lernt eben nie aus...</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1212854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1212854</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Fri, 19 Jan 2007 18:35:57 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 11:22:33 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Ob du es glaubst oder nicht, genau das ist es aber, was ich will... bzw. die Aufgabenstellung vorgibt. ...</p>
</blockquote>
<p>Glaube ich immer noch nicht. <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="😉"
    /> <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>
<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Klasse 'tverw' ist die einzige, die von außen aus der main() erreichbar/ benutzt werden soll. Diese fängt dann an, einzelne Teile (Klasse 'teil') aus einer von der main() angegebenen DatenDatei. ....</p>
</blockquote>
<p>(ich tippe mal drauf, dass da noch ein &quot;erzeugt&quot; kommen sollte)</p>
<p>Nochmal die Frage: &quot;IST tverw ein teil ?&quot;<br />
Wenn also z.B. tverw von teil erbt ... hat dann teil auch eine Funktion add() ?</p>
<p>Ganz schwierig ist schon die Tatsache, dass ein tverw mehrere teile erzeugen soll .... wie soll das gehen ? Kann ein Opel auch mehrere Autos sein ?</p>
<p>Wenn ich die Aufgabe recht verstehe, soll außer tverw niemand ein teil erzeugen oder auf eine seiner Funktionen/Attribute zugreifen können.<br />
Für eine &quot;Zugriffsbeschränkung&quot; bietet C++ &quot;Access specifier&quot; (public, protected, private) an.</p>
<p>ich sehe immer noch zwei (IMO bessere) Entwurfsvarianten:</p>
<pre><code class="language-cpp">class tverw; // forward declaration

class teil {
// Alles private: Damit kann niemand außer friends was damit machen
    int meinPrivatesAttr;

    teil(int i) : meinPrivatesAttr(i) {}
    teil(teil const &amp; other) { meinPrivatesAttr = other.meinPrivatesAttr; }
    teil const &amp; operator=(teil const &amp; other) {
        meinPrivatesAttr = other.meinPrivatesAttr;
        return *this;
    }
    ~teil() {}

    void meinePrivateFunc() const { 
        cout &lt;&lt; &quot;ich bins: &quot; &lt;&lt; meinPrivatesAttr &lt;&lt; &quot;\n&quot;;
    }

    friend tverw;
};

class tverw {
    vector&lt;teil&gt; teile;
    int teilNummer;
public:
    tverw() : teilNummer(0) {}
    void addTeil() {
        teile.push_back(teil(teilNummer++));
    }
    void bearbeiteTeile() {
        vector&lt;teil&gt;::const_iterator it = teile.begin();
        vector&lt;teil&gt;::const_iterator const end = teile.end();
        for(; it != end; ++it) it-&gt;meinePrivateFunc();
    }
};
</code></pre>
<p>(lustigerweise &quot;weiß&quot; tverw nicht mal, dass er der Einzige ist, der auf teil zugreifen kann - braucht er aber auch nicht; es reicht, dass es so ist)</p>
<p>Oder (wenn auch außerhalb von tverw niemand die Klasse teil sehen soll):</p>
<pre><code class="language-cpp">class tverw {
    class teil { // innere Klasse
     ... (wie oben)
    };

    vector&lt;teil&gt; teile;
    int teilNummer;
public:
 ... (wie oben)
};
</code></pre>
<p>In beiden Fällen erbt tverw NICHT von teil, sondern &quot;aggregiert&quot; sie.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213099</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 20 Jan 2007 11:22:33 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 16:40:50 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Glaube ich immer noch nicht. <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="😉"
    /> <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>
</blockquote>
<p>macht nichts *g*</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>(ich tippe mal drauf, dass da noch ein &quot;erzeugt&quot; kommen sollte)</p>
</blockquote>
<p>im Prinzip ja... ich korrigiere: &quot;[...] zu erzeugen.&quot;</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Nochmal die Frage: &quot;IST tverw ein teil ?&quot;</p>
</blockquote>
<p>nein, 'tverw' verwaltet mehrere 'teil'e in einem Zeiger enthaltenden Array --&gt;</p>
<pre><code>teil * * tArr;
[...]
tArr = new teil * [tAnz];
</code></pre>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Wenn also z.B. tverw von teil erbt ... hat dann teil auch eine Funktion add() ?</p>
</blockquote>
<p>Hier bin ich mir in der Bedeutung der Vokabeln unsicher. Erbt ein 'friend'? 'teil' hat eine Funktion chgBestand() --&gt; Bestand ändern.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Ganz schwierig ist schon die Tatsache, dass ein tverw mehrere teile erzeugen soll .... wie soll das gehen ? Kann ein Opel auch mehrere Autos sein ?</p>
</blockquote>
<p>Vielleicht muss man hier die Frage anders formulieren: &quot;Passen in eine Garage mehrere unterschiedliche Autos?&quot; Antwort: &quot;Ja, wenn sie genug Stellplätze hat.&quot; Und da ich die Anzahl der benötigten 'Stellplätze' direkt vor dem Bau der Garage erfahre, baue ich sie groß genug. (Im Ernst: Die Anzahl der Datensätze geht aus der 4. Zeile der Datendatei hervor, direkt vor den dann folgenden unterschiedlichen Datensätzen.)</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Wenn ich die Aufgabe recht verstehe, soll außer tverw niemand ein teil erzeugen oder auf eine seiner Funktionen/Attribute zugreifen können.</p>
</blockquote>
<p>Das verstehst du richtig.</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Für eine &quot;Zugriffsbeschränkung&quot; bietet C++ &quot;Access specifier&quot; (public, protected, private) an.</p>
</blockquote>
<p>Das ist korrekt aber darum geht es leider nicht. Es geht darum, einer ziemlich konkreten Aufgabenstellung gerecht zu werden. Und die lässt wenig Spielraum. Wenn´s interessiert, dann stelle ich die Aufgabe mal zu Diskussion. Ach was, mach ich einfach: <a href="http://www.chpohl.de/prog/teile.zip" rel="nofollow">Download!</a></p>
<p>Deine Entwurfsvarianten kann ich leider mangels Kenntnissen nicht beurteilen. Ich werde versuchen sie bei Gelegenheit zu begreifen. Erzeugt[C++]vector&lt;teil&gt; teile;[/C++]nicht auch sowas wie eine 'Garage' für verschiedene 'teil'e?</p>
<p>Es fängt an, mir noch mehr Spaß zu machen!</p>
<p>so long<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213171</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Sat, 20 Jan 2007 16:40:50 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 19:46:01 GMT]]></title><description><![CDATA[<p>OK,</p>
<p>jetzt hast Du mich endgültig überzeugt ..... dass ich Recht habe. <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>
<ul>
<li><strong>Ableiten</strong>: Wenn tverw ein teil ist</li>
<li><strong>Aggregieren</strong>: Wenn tverw einen/mehrere teil(e) verwaltet</li>
</ul>
<p>(Wenn Du den Satz mal mit &quot;tverw = Garage&quot; und &quot;teil = Auto&quot; liest, wird die Wahl klar sein)</p>
<p>In Deinem Aufgabentext ist ja ein &quot;Vererbungsschema&quot; abgebildet - und da sieht man, dass tverw NICHT von teil erbt, sondern ein &quot;teil-Array aggregiert&quot; (teil** tArr).</p>
<p>Außerdem steht da zu teil:<br />
&quot;... abstrakte Basisklasse, da eine<br />
rein-virtuelle Funktionen<br />
deklariert ist, keine Instanz<br />
möglich...&quot;<br />
D.h. Du brauchst gar nichts zu machen, damit teil nicht &quot;von Außen&quot; erzeugt werden kann ... das kann niemand ! Und zwar wegen</p>
<pre><code class="language-cpp">virtual void printTeil ( void ) = 0;
</code></pre>
<p>ChrisPHL schrieb:</p>
<blockquote>
<p>...</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Nochmal die Frage: &quot;IST tverw ein teil ?&quot;</p>
</blockquote>
<p>nein, 'tverw' verwaltet mehrere 'teil'e in einem Zeiger enthaltenden Array --&gt;</p>
<pre><code>teil * * tArr;
[...]
tArr = new teil * [tAnz];
</code></pre>
</blockquote>
<p>OK, sorry, ich hatte &quot;C++ gemacht&quot;, wo Euer Tutor offensichtlich noch &quot;in C festklemmt&quot;. <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="😉"
    /><br />
Guter Stil wäre die Verwendung von std::vector (typsicher, komfortabel, unproblematisch bzgl. Speicherlecks/-überschreitungen) .... da solltest Du Deinen Tutor mal vorbeischicken, damit wir ihm hier die Ohren langziehen. <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="😃"
    /><br />
(Es kann natürlich sein, dass Ihr Speicherverwaltung lernen sollt, aber ich halte das heutzutage für Anfänger überflüssig, verwirrend und letztlich &quot;Quatsch&quot;).</p>
<p>Ihr sollt halt ein Array von Zeigern anlegen, wo ich einen vector von teilen verwendete .... mit den neuen Kenntnissen würde ich einen vector von Zeigern nehmen ( vector&lt;teile*&gt; - das nimmt Dir die Erweiterung von tArr und die Verwaltung der Anzahl in tAnz ab) .... aber anscheinend hast Du die Wahl nicht - macht aber nichts, es geht mit tArr&amp;tAnz auch (musst nur ein wenig mehr frickeln).</p>
<p>ChrisPHL schrieb:</p>
<blockquote>
<p>...</p>
<p>Simon2 schrieb:</p>
<blockquote>
<p>Wenn also z.B. tverw von teil erbt ... hat dann teil auch eine Funktion add() ?</p>
</blockquote>
<p>Hier bin ich mir in der Bedeutung der Vokabeln unsicher. Erbt ein 'friend'?</p>
</blockquote>
<p>Zur Info: &quot;Friend&quot; kann jeder sein ... ob er nun in einer Vererbungsbeziehung steht oder nicht (z.B. können auch &quot;freie Funktionen&quot; befriended sein ... und die können natürlich nix erben. &quot;friend&quot; hat einfach mit &quot;Vererbung&quot; nichts zu tun.</p>
<p>OK, ich denke, Du kommst erstmal klar.<br />
Wenn nicht, melde Dich wieder (bin aber wohl erst morgen abend wieder online - aber die anderen hier können das mindestens genauso gut).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213383</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 20 Jan 2007 19:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 21:06:35 GMT]]></title><description><![CDATA[<p>Du hast mir nochmal sehr geholfen! Tausend Dank!<br />
Wenn du dir mal die &quot;teile.cpp&quot; aus der Aufgabenstellung anschaust, dann wird dir einiges klar... von wegen &quot;[...] Tutor offensichtlich noch 'in C festklemmt'&quot;.<br />
Habe soeben die <a href="http://www.chpohl.de/prog/t_loesung.zip" rel="nofollow">Lösung</a> fertig geschrieben.<br />
Eine klitzekleine Frage dazu habe ich aber noch: Wenn ich mit</p>
<pre><code class="language-cpp">cin = teilenummer;
</code></pre>
<p>ganz bösartig einen Wert von z.B. 3456783468532784657893145 übertrage, verhaspelt sich... wer auch immer. Lese ich dagegen den Wert mit</p>
<pre><code class="language-cpp">scanf(&quot;%d&quot;, &amp;teilenummer);
</code></pre>
<p>ein, gibt´s das Teil halt nicht und fertig ist´s...<br />
Warum, bzw: wie geht´s besser mit &quot;cin&quot; oder alg. im C++- Stil?</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213413</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Sat, 20 Jan 2007 21:06:35 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 21:11:14 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>...</p>
<pre><code class="language-cpp">cin = teilenummer;
</code></pre>
<p>...</p>
</blockquote>
<p>Falscher operator <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>
<pre><code class="language-cpp">cin &gt;&gt; teilenummer;
if(!cin) {
   cout &lt;&lt; &quot;ungültige Eingabe\n&quot;;
  return ... ;
}
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213424</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 20 Jan 2007 21:11:14 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 21:35:22 GMT]]></title><description><![CDATA[<p>Nein das löst es leider nicht...<br />
Ich habe es mal mit einer solchen &quot;Fangschaltung&quot; probiert. Wenn ich bei einer &quot;übergroßen&quot; Eingabe dann einfach tatenlos die Funktion bende, dann kriegt man beim nächsten Aufruf der Funktion gleich eine alá &quot;Falsche Eingabe!&quot; übergebraten. Ein cin.sync(); führe ich vor dem &quot;cin &gt;&gt; teilenummer;&quot; (Jetzt stimmt der Operator aber! ;-)) aus.<br />
Noch Ideen?</p>
<p>Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213441</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213441</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Sat, 20 Jan 2007 21:35:22 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 21:50:00 GMT]]></title><description><![CDATA[<p>Hmmm,</p>
<p>also bei mir klappt's:</p>
<pre><code class="language-cpp">int main() {
   int Nummer;
   cout &lt;&lt; &quot;Nummer eingeben; &quot;;
   cin &gt;&gt; Nummer;
   if(!cin) {
      cout &lt;&lt; &quot;NOT cin\n&quot;;
   }
   else {
      cout &lt;&lt; &quot;cin : &quot; &lt;&lt; Nummer &lt;&lt; &quot;\n&quot;;
   }
   return 0;
}
</code></pre>
<p>Output:&gt;&gt;<br />
Nummer eingeben; 12345678901234567890<br />
NOT cin<br />
&lt;&lt;</p>
<p>Passt also - ich vermute, dass Du nach der Abfrage auf cin &quot;falsch weitermachst&quot;.<br />
Zum Einen musst Du natürlich teileNummer nochmal richtig einlesen - zum Anderen (und das hätte ich wohl gleich sagen sollen) musst Du vor der erneuten Verwendung von cin dessen Fehlerflag löschen mit</p>
<pre><code class="language-cpp">cin.clear();
</code></pre>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213448</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 20 Jan 2007 21:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 21:56:35 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>[...] und das hätte ich wohl gleich sagen sollen [...]</p>
</blockquote>
<p>Genau!</p>
<pre><code class="language-cpp">cin.clear();
</code></pre>
<p>Das fehlte noch, jetzt klappt´s!</p>
<p>Vielen Dank!<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213453</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Sat, 20 Jan 2007 21:56:35 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 22:21:44 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>[...] und das hätte ich wohl gleich sagen sollen [...]</p>
</blockquote>
<p>Genau!</p>
<pre><code class="language-cpp">cin.clear();
</code></pre>
<p>Das fehlte noch, jetzt klappt´s!</p>
<p>Vielen Dank!<br />
Christian</p>
</blockquote>
<p>Schön !!!</p>
<p>Zum &quot;fehlenden Hinweis&quot;: Ich ware davon ausgegangen, dass die Abfrage im main() stattfindet und im Fehlerfall das Programm abgebrochen wird .... soweit zu meiner Verteidigung. <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>
<p>Eine gute Nacht noch,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213456</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213456</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 20 Jan 2007 22:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sat, 20 Jan 2007 22:40:40 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>[...] davon ausgegangen, dass die Abfrage im main() stattfindet [...]</p>
</blockquote>
<p>Darfst du aber nicht! :p denn:</p>
<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Wenn du dir mal die &quot;teile.cpp&quot; aus der Aufgabenstellung anschaust, dann wird dir einiges klar... von wegen &quot;[...] Tutor offensichtlich noch 'in C festklemmt'&quot;.</p>
</blockquote>
<p>Na dann gute Nacht!</p>
<p>Gruß<br />
Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213459</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Sat, 20 Jan 2007 22:40:40 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sun, 21 Jan 2007 12:08:56 GMT]]></title><description><![CDATA[<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Simon2 schrieb:</p>
<blockquote>
<p>[...] davon ausgegangen, dass die Abfrage im main() stattfindet [...]</p>
</blockquote>
<p>Darfst du aber nicht! :p denn:</p>
<p>ChrisPHL schrieb:</p>
<blockquote>
<p>Wenn du dir mal die &quot;teile.cpp&quot; aus der Aufgabenstellung anschaust, dann wird dir einiges klar... von wegen &quot;[...] Tutor offensichtlich noch 'in C festklemmt'&quot;.</p>
</blockquote>
<p>Na dann gute Nacht!</p>
<p>Gruß<br />
Christian</p>
</blockquote>
<p>Sorry, dass ich Dir helfen wollte, ohne mir seitenweise fremden Source anzusehen - soll nicht wieder vorkommen. :p<br />
Übrigens: Auf clear() kann man auch selbst kommen - dazu braucht man micht nicht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213619</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213619</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sun, 21 Jan 2007 12:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Aufruf einer Basisklassenfunktion; früher: was darf friend? on Sun, 21 Jan 2007 12:34:51 GMT]]></title><description><![CDATA[<p>Ist doch kein Thema, hab nur kurz den Klugsch-beep-modus aktiviert. <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="😉"
    /><br />
Für das &quot;clear()&quot; bin ich glaube ich einfach noch zu sehr Anfänger Aber ich gelobe Besserung: Ab sofort komme ich selber auf das &quot;clear()&quot;.</p>
<p>Christian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1213637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1213637</guid><dc:creator><![CDATA[ChrisPHL]]></dc:creator><pubDate>Sun, 21 Jan 2007 12:34:51 GMT</pubDate></item></channel></rss>