<?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[Instanz aus mehreren abgeleiteten Klassen erzeugen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mal eine Frage zur optimalen Steuerung bzw. gut organisiertem Code um eine Instanz aus unterschiedlichen abgeleiteten Klassen zu erzeugen. Hier erstmal etwas Beispiel Code:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#include &lt;iostream&gt;
#pragma hdrstop

#include &quot;Main.h&quot;
#include &quot;BasisClass.h&quot;
#include &quot;SubClass1.h&quot;
#include &quot;SubClass2.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
using namespace std;

CSub1 *TF1 = 0;       // Zeiger auf Objekt der SubClass1
CSub2 *TF2 = 0;       // Zeiger auf Objekt der SubClass2
// etc. ...

Sub1Parameters SUB1;  // Definition von Strukturvariablen
Sub2Parameters SUB2;  // zur Parameterübergabe von und zum Objekt
// etc. ...

int iValue;           // Wählt die abgeleitete Klasse aus

TForm1 *Form1;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
 iValue = 0;    // iValue wird an anderer Stelle im Programm gesetzt
 //iValue = 1;  // und bestimmt die abgeleitete Klasse von der eine
	       // Instanz erzeugt werden soll.
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if ( TF1 || TF2 ) deleteTF();
 switch ( iValue )
   {
	case 0: TF1 = new CSub1();
			TF1-&gt;getSub1Setup( &amp;SUB1 );
			break;
	case 1: TF2 = new CSub2();
			TF2-&gt;getSub2Setup( &amp;SUB2 );
			break;
	// etc. ...
   }
 ListBox1-&gt;Items-&gt;Add(&quot;A = &quot; + IntToStr(SUB1.iA) +
					  &quot;, B = &quot; + IntToStr(SUB1.iB) +
					  &quot;, I1 = &quot; + IntToStr(SUB1.iI1) +
					  &quot;, I2 = &quot; + IntToStr(SUB1.iI2));
 ListBox1-&gt;Items-&gt;Add(&quot;A = &quot; + IntToStr(SUB2.iA) +
					  &quot;, B = &quot; + IntToStr(SUB2.iB) +
					  &quot;, J1 = &quot; + IntToStr(SUB2.iJ1) +
					  &quot;, J2 = &quot; + IntToStr(SUB2.iJ2));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::deleteTF()
{
 if ( TF1 )
   {
	delete TF1;
	TF1 = 0;
   }
 if ( TF2 )
   {
	delete TF2;
	TF2 = 0;
   }
 // etc. ...  
}
//---------------------------------------------------------------------------
</code></pre>
<p>Ich suche nach einer Möglichkeit über eine Schleife das Löschen des Objektes und evtl. über Felder das Aufrufen der Methoden in mehreren Funktionen einfacher zu handhaben, also nicht für jedes unterschiedliche Objekt eine eigene Behandlungsfunktion/Abfrage zu haben.</p>
<p>In meinem Programm gibt es immer nur eine Instanz von einer abgeleiteten Klasse die über das Programm ausgewählt wird, eine Basisklasse aber mehrere abgeleitete Klassen (und es kommen auch noch neue Ableitungen hinzu). Im Moment hänge ich an diesem Ablauf fest und es fällt mir keine bessere Lösung ein. Bei 2 Ableitungen wäre das kein Problem, aber wenn es mehrere sind ist das so relativ aufwendig. Aber da gibt es doch bestimmt eine einfachere Lösung dafür, oder ?!</p>
<p>Danke für jeden Tip</p>
<p>WoWe</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189190/instanz-aus-mehreren-abgeleiteten-klassen-erzeugen</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 08:45:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189190.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Aug 2007 13:54:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Instanz aus mehreren abgeleiteten Klassen erzeugen on Fri, 10 Aug 2007 09:58:13 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mal eine Frage zur optimalen Steuerung bzw. gut organisiertem Code um eine Instanz aus unterschiedlichen abgeleiteten Klassen zu erzeugen. Hier erstmal etwas Beispiel Code:</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#include &lt;iostream&gt;
#pragma hdrstop

#include &quot;Main.h&quot;
#include &quot;BasisClass.h&quot;
#include &quot;SubClass1.h&quot;
#include &quot;SubClass2.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource &quot;*.dfm&quot;
using namespace std;

CSub1 *TF1 = 0;       // Zeiger auf Objekt der SubClass1
CSub2 *TF2 = 0;       // Zeiger auf Objekt der SubClass2
// etc. ...

Sub1Parameters SUB1;  // Definition von Strukturvariablen
Sub2Parameters SUB2;  // zur Parameterübergabe von und zum Objekt
// etc. ...

int iValue;           // Wählt die abgeleitete Klasse aus

TForm1 *Form1;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
 iValue = 0;    // iValue wird an anderer Stelle im Programm gesetzt
 //iValue = 1;  // und bestimmt die abgeleitete Klasse von der eine
	       // Instanz erzeugt werden soll.
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if ( TF1 || TF2 ) deleteTF();
 switch ( iValue )
   {
	case 0: TF1 = new CSub1();
			TF1-&gt;getSub1Setup( &amp;SUB1 );
			break;
	case 1: TF2 = new CSub2();
			TF2-&gt;getSub2Setup( &amp;SUB2 );
			break;
	// etc. ...
   }
 ListBox1-&gt;Items-&gt;Add(&quot;A = &quot; + IntToStr(SUB1.iA) +
					  &quot;, B = &quot; + IntToStr(SUB1.iB) +
					  &quot;, I1 = &quot; + IntToStr(SUB1.iI1) +
					  &quot;, I2 = &quot; + IntToStr(SUB1.iI2));
 ListBox1-&gt;Items-&gt;Add(&quot;A = &quot; + IntToStr(SUB2.iA) +
					  &quot;, B = &quot; + IntToStr(SUB2.iB) +
					  &quot;, J1 = &quot; + IntToStr(SUB2.iJ1) +
					  &quot;, J2 = &quot; + IntToStr(SUB2.iJ2));
}
//---------------------------------------------------------------------------

void __fastcall TForm1::deleteTF()
{
 if ( TF1 )
   {
	delete TF1;
	TF1 = 0;
   }
 if ( TF2 )
   {
	delete TF2;
	TF2 = 0;
   }
 // etc. ...  
}
//---------------------------------------------------------------------------
</code></pre>
<p>Ich suche nach einer Möglichkeit über eine Schleife das Löschen des Objektes und evtl. über Felder das Aufrufen der Methoden in mehreren Funktionen einfacher zu handhaben, also nicht für jedes unterschiedliche Objekt eine eigene Behandlungsfunktion/Abfrage zu haben.</p>
<p>In meinem Programm gibt es immer nur eine Instanz von einer abgeleiteten Klasse die über das Programm ausgewählt wird, eine Basisklasse aber mehrere abgeleitete Klassen (und es kommen auch noch neue Ableitungen hinzu). Im Moment hänge ich an diesem Ablauf fest und es fällt mir keine bessere Lösung ein. Bei 2 Ableitungen wäre das kein Problem, aber wenn es mehrere sind ist das so relativ aufwendig. Aber da gibt es doch bestimmt eine einfachere Lösung dafür, oder ?!</p>
<p>Danke für jeden Tip</p>
<p>WoWe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341563</guid><dc:creator><![CDATA[WoWe]]></dc:creator><pubDate>Fri, 10 Aug 2007 09:58:13 GMT</pubDate></item><item><title><![CDATA[Reply to Instanz aus mehreren abgeleiteten Klassen erzeugen on Thu, 09 Aug 2007 17:47:16 GMT]]></title><description><![CDATA[<p>Hallo, seh ich das richtig, das CSub1 und CSub2 von der gleichen basisklasse erben?</p>
<pre><code class="language-cpp">class Base{

virtual Funk()=0;
virtual ~Base(){..};

};

class CSub1 : public Base{

virtual Funk(){...tu was mit CSub1 daten... }
virtual ~CSub1(){..};
};

class CSub2 : public Base{

virtual Funk(){...tu was mit CSub2 daten... }
virtual ~CSub2(){..};
};
</code></pre>
<p>jetzt kannst du alle Instaanzen der CSub1 und CSub2 Klasse in eine array oder Liste aus Base pointer anlegen..</p>
<pre><code class="language-cpp">Base *p[100];

p[0]= new Sub1();
p[1]= new Sub2();
....
</code></pre>
<p>wennn du nun p[0] löscht, wird automatisch der destruktor von sub1 aufgerufen egro p[1] von Sub2</p>
<p>wenn du</p>
<pre><code class="language-cpp">p[0]-&gt;Funk();
</code></pre>
<p>machst wird die methode der sub1 aufgerufen ... p[1] dann von Sub2</p>
<p>einfach polymorphy vewenden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341778</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Thu, 09 Aug 2007 17:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to Instanz aus mehreren abgeleiteten Klassen erzeugen on Thu, 09 Aug 2007 22:40:40 GMT]]></title><description><![CDATA[<p>Hallo BorisDieKlinge,</p>
<p>vielen Dank für deine Hilfe. Das werde ich mal studieren. Wahrscheinlich komme ich nochmal mit der ein oder anderen Frage.</p>
<p>WoWe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341942</guid><dc:creator><![CDATA[WoWe]]></dc:creator><pubDate>Thu, 09 Aug 2007 22:40:40 GMT</pubDate></item><item><title><![CDATA[Reply to Instanz aus mehreren abgeleiteten Klassen erzeugen on Fri, 10 Aug 2007 10:19:31 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>jetzt habe ich doch nochmal 2 Fragen dazu:</p>
<p>Basis.h</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#ifndef BasisClassH
#define BasisClassH

struct Sub1Parameters
{
  int iA;
  int iB;
  int iI1;
  int iI2;
  // etc.
};

struct Sub2Parameters
{
  int iA;
  int iB;
  int iJ1;
  int iJ2;
  // etc.
};

class CBasis
{
 private:
	int m_A, m_B;

 public:
	__fastcall CBasis();
	virtual __fastcall ~CBasis();
	__fastcall getIntA() const {return m_A;}
	__fastcall getIntB() const {return m_B;}
	void __fastcall setIntA( int A ) {m_A = A;}
	void __fastcall setIntB( int B ) {m_B = B;}
	virtual void __fastcall getSub1Setup( Sub1Parameters * ) const;
	virtual void __fastcall getSub2Setup( Sub2Parameters * ) const;
	// Methoden ...
};
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>Basis.cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#include &lt;iostream&gt;
#pragma hdrstop

#include &quot;BasisClass.h&quot;
#include &quot;Main.h&quot;

//---------------------------------------------------------------------------

#pragma package(smart_init)
using namespace std;

__fastcall CBasis::CBasis()
{
 m_A = 1;
 m_B = 2;
 Form1-&gt;ListBox1-&gt;Items-&gt;Add(&quot;Basis Konstruktor&quot;);
}
//---------------------------------------------------------------------------

__fastcall CBasis::~CBasis()
{
 Form1-&gt;ListBox1-&gt;Items-&gt;Add(&quot;Basis Destruktor&quot;);
}
//---------------------------------------------------------------------------

void __fastcall CBasis::getSub1Setup( Sub1Parameters *Setup ) const
{
}
//---------------------------------------------------------------------------

void __fastcall CBasis::getSub2Setup( Sub2Parameters *Setup ) const
{
}
//---------------------------------------------------------------------------
</code></pre>
<p>SubClass1.h</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#ifndef SubClass1H
#define SubClass1H
#include &quot;BasisClass.h&quot;

class CSub1 : public CBasis
{
 private:
	int m_I1, m_I2;

 public:
	__fastcall CSub1();
	__fastcall ~CSub1();
	void __fastcall getSub1Setup( Sub1Parameters * ) const;
	void __fastcall setSub1Setup( const Sub1Parameters &amp; );
};
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>SubClass1.cpp</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------

#include &lt;vcl.h&gt;
#include &lt;iostream&gt;
#pragma hdrstop

#include &quot;SubClass1.h&quot;
#include &quot;Main.h&quot;

//---------------------------------------------------------------------------

#pragma package(smart_init)
using namespace std;

__fastcall CSub1::CSub1()
{
 m_I1 = 10;
 m_I2 = 11;
 Form1-&gt;ListBox1-&gt;Items-&gt;Add(&quot;Sub1 Konstruktor&quot;);
}
//---------------------------------------------------------------------------

__fastcall CSub1::~CSub1()
{
 Form1-&gt;ListBox1-&gt;Items-&gt;Add(&quot;Sub1 Destruktor&quot;);
}
//---------------------------------------------------------------------------

void __fastcall CSub1::getSub1Setup( Sub1Parameters *Setup ) const
{
 Setup-&gt;iA = getIntA();
 Setup-&gt;iB = getIntB();
 Setup-&gt;iI1 = m_I1;
 Setup-&gt;iI2 = m_I2;
}
//---------------------------------------------------------------------------

void __fastcall CSub1::setSub1Setup( const Sub1Parameters &amp; New )
{
 m_I1 = New.iI1;
 m_I2 = New.iI2;
 setIntA( New.iA );
 setIntB( New.iB );
}
//---------------------------------------------------------------------------
</code></pre>
<p>Also zuerst einmal, das funktioniert so, aber ich bin mir nicht sicher ob meine Schreibweise so korrekt ist, deshalb nochmal 2 Fragen:</p>
<p>1. Muss ich so wie oben <strong>jede</strong> Spezialfunktion einer abgeleiteten Klasse auch als &quot;virtual Dummy&quot; in der Basisklasse aufnehmen ?</p>
<p>2. Muss das Schlüsselwort &quot;virtual&quot; auch in den abgeleiteten Klassen vor den Funktionen stehen bzw. werden die Funktionen in den abgeleiteten Klassen nicht automatisch zu virtual? Geht auch ohne !</p>
<p>Danke und Gruß</p>
<p>WoWe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342099</guid><dc:creator><![CDATA[WoWe]]></dc:creator><pubDate>Fri, 10 Aug 2007 10:19:31 GMT</pubDate></item></channel></rss>