<?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[Compiletime Polymorphismus-&amp;gt;Problem mit Templates]]></title><description><![CDATA[<p>Hallo liebe C++ler,</p>
<p>ich habe ein Problem was ich selbst nicht ganz in den Griff bekomme und darüberhinaus tue ich mich auch schwer mein Problem zu erklären - ich bitte diesbezüglich um nachsicht.</p>
<p>Ich instantiiere eine klasse je nach compile-flag und diese ist auch nicht template-basiert. Jetzt habe ich später eine basisklasse die selbst ein templatebasiertes objekt hat (Server). Und dieses Objekt soll nun aber je nach compile-instantiierung unterschiedliche methoden ausführen.</p>
<p>Mein Problem besteht darin dass ich Methoden in diesem Objekt habe die in der klasse derived1/derived2 vorkommen sollen (weil dazu habe ich die compilezeit-polymorphie gemacht) und abe diese methoden greifen gleichzeitig auf methoden innerhalb dieses objekt zu. Im code habe ich das über das kommentar <a href="//b.problemfunc">//b.problemfunc</a>(); markiert. problemfunc() ist nicht implementiert innerhalb der abgeleiteten klassen derived1 und derived2.</p>
<p>Folgender Pseudocode funktioniert NICHT! Zumindest habe ihc die letzten 3 fehler nicht beheben können aber er veranschaulicht mein Problem - also ein minimalbeispiel.</p>
<p>Frage: Habe ich eine Möglichkeit mein Ziel zu erreichen in<br />
void Server&lt;T&gt;::myfunc(base&amp; b)<br />
in eine methode von entweder derived1 oder derived2 zu springen und dort dann wiederum eine methode von Server aufzurufen ( myfunc2() ) ?</p>
<p>Habe ich ein falsches Design oder verstehe ich grundlegend etwas nicht?</p>
<p>Über jegliche Hilfe würde ich mich freuen ! DANKE</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class base
{
public:
   base() {}

  virtual void print() = 0;
   void foo() { std::cout&lt;&lt; &quot;base: &quot; &lt;&lt; std::endl;
       print();
   }
};
class derived1 : public base
{
public:        
  void print()
  {
    std::cout &lt;&lt; &quot;derived1&quot; &lt;&lt; std::endl;
  }
};
class derived2 : public base
{
  public:        
    void print()
    {
      std::cout &lt;&lt; &quot;derived2&quot; &lt;&lt; std::endl;
     }
};

template&lt;class T&gt;
class Server
{
        public:
                void myfunc(base&amp; b);     
                void myfunc2();

};
template&lt;class T&gt; void Server&lt;T&gt;::myfunc2()
{
        std::cout &lt;&lt; &quot;test&quot;&lt;&lt; std::endl;       
}
template&lt;class T&gt; void Server&lt;T&gt;::myfunc(base&amp; b)
{
    // Hier will ich jetzt gern auf die methode
        // problemfunc in einer abgeleiteten klase von base
        // zugreifen ABER: In problemfunc muss/wird ein aufruf von 
        // myfunc2 von klasse server gemacht. Wie soll ich das bewerkstelligen?
    //b.problemfunc();
}

template&lt;class T&gt; 
class CBase
{
        public:

           CBase&lt;T&gt;();
           void bar(base&amp; b);
                // noch weitere virtual functions...
           T* Server;
};
template&lt;class T&gt; CBase&lt;T&gt;::CBase() 
{
        Server = new Server&lt;T&gt;();
}

template&lt;class T&gt; void CBase&lt;T&gt;::bar(base&amp; b) {
    //Hier weiß ich nicht wie weiter
    // Ich will jetzt je nach 
    Server.myfunc(b);
}

int main()
{
  base* b = NULL;
#ifdef MYFLAG
  b  = new derived1();
#else
  b = new derived2();
#endif

  CBase&lt;double&gt; *cbase = new CBase&lt;double&gt;();
  cbase-&gt;bar(b);

  delete b;
  delete cbase;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/258216/compiletime-polymorphismus-gt-problem-mit-templates</link><generator>RSS for Node</generator><lastBuildDate>Wed, 09 Sep 2026 12:06:41 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/258216.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Jan 2010 21:45:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Compiletime Polymorphismus-&amp;gt;Problem mit Templates on Thu, 07 Jan 2010 21:45:28 GMT]]></title><description><![CDATA[<p>Hallo liebe C++ler,</p>
<p>ich habe ein Problem was ich selbst nicht ganz in den Griff bekomme und darüberhinaus tue ich mich auch schwer mein Problem zu erklären - ich bitte diesbezüglich um nachsicht.</p>
<p>Ich instantiiere eine klasse je nach compile-flag und diese ist auch nicht template-basiert. Jetzt habe ich später eine basisklasse die selbst ein templatebasiertes objekt hat (Server). Und dieses Objekt soll nun aber je nach compile-instantiierung unterschiedliche methoden ausführen.</p>
<p>Mein Problem besteht darin dass ich Methoden in diesem Objekt habe die in der klasse derived1/derived2 vorkommen sollen (weil dazu habe ich die compilezeit-polymorphie gemacht) und abe diese methoden greifen gleichzeitig auf methoden innerhalb dieses objekt zu. Im code habe ich das über das kommentar <a href="//b.problemfunc">//b.problemfunc</a>(); markiert. problemfunc() ist nicht implementiert innerhalb der abgeleiteten klassen derived1 und derived2.</p>
<p>Folgender Pseudocode funktioniert NICHT! Zumindest habe ihc die letzten 3 fehler nicht beheben können aber er veranschaulicht mein Problem - also ein minimalbeispiel.</p>
<p>Frage: Habe ich eine Möglichkeit mein Ziel zu erreichen in<br />
void Server&lt;T&gt;::myfunc(base&amp; b)<br />
in eine methode von entweder derived1 oder derived2 zu springen und dort dann wiederum eine methode von Server aufzurufen ( myfunc2() ) ?</p>
<p>Habe ich ein falsches Design oder verstehe ich grundlegend etwas nicht?</p>
<p>Über jegliche Hilfe würde ich mich freuen ! DANKE</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

class base
{
public:
   base() {}

  virtual void print() = 0;
   void foo() { std::cout&lt;&lt; &quot;base: &quot; &lt;&lt; std::endl;
       print();
   }
};
class derived1 : public base
{
public:        
  void print()
  {
    std::cout &lt;&lt; &quot;derived1&quot; &lt;&lt; std::endl;
  }
};
class derived2 : public base
{
  public:        
    void print()
    {
      std::cout &lt;&lt; &quot;derived2&quot; &lt;&lt; std::endl;
     }
};

template&lt;class T&gt;
class Server
{
        public:
                void myfunc(base&amp; b);     
                void myfunc2();

};
template&lt;class T&gt; void Server&lt;T&gt;::myfunc2()
{
        std::cout &lt;&lt; &quot;test&quot;&lt;&lt; std::endl;       
}
template&lt;class T&gt; void Server&lt;T&gt;::myfunc(base&amp; b)
{
    // Hier will ich jetzt gern auf die methode
        // problemfunc in einer abgeleiteten klase von base
        // zugreifen ABER: In problemfunc muss/wird ein aufruf von 
        // myfunc2 von klasse server gemacht. Wie soll ich das bewerkstelligen?
    //b.problemfunc();
}

template&lt;class T&gt; 
class CBase
{
        public:

           CBase&lt;T&gt;();
           void bar(base&amp; b);
                // noch weitere virtual functions...
           T* Server;
};
template&lt;class T&gt; CBase&lt;T&gt;::CBase() 
{
        Server = new Server&lt;T&gt;();
}

template&lt;class T&gt; void CBase&lt;T&gt;::bar(base&amp; b) {
    //Hier weiß ich nicht wie weiter
    // Ich will jetzt je nach 
    Server.myfunc(b);
}

int main()
{
  base* b = NULL;
#ifdef MYFLAG
  b  = new derived1();
#else
  b = new derived2();
#endif

  CBase&lt;double&gt; *cbase = new CBase&lt;double&gt;();
  cbase-&gt;bar(b);

  delete b;
  delete cbase;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1834709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834709</guid><dc:creator><![CDATA[Mati]]></dc:creator><pubDate>Thu, 07 Jan 2010 21:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Polymorphismus-&amp;gt;Problem mit Templates on Fri, 08 Jan 2010 07:00:02 GMT]]></title><description><![CDATA[<p>Also eigentlich sollte dien Wunsch durch die Polymorphie bereits abgegolten sein. Polymorphie bedeutet nicht einfach nur, dass du verschiedene Objekte mit der gleichen Basis als Argument verwenden kannst.</p>
<pre><code class="language-cpp">class basis
{
   public:
   virtual void func1() = 0;
};
class abgel1 : public basis
{
   public:
   virtual void func1(){};
};
class abgel2 : public basis
{
   public:
   virtual void func1(){};
   void func2(){};
};

int main()
{
   basis * p = new abgl1();
   p-&gt;func1();  // func1 aus abgel1
   delete p;

   p = new abgl2();
   p-&gt;func1(); // func1 aus abgel2  

   return 0;
}
</code></pre>
<p>Möchtest du jedoch abhängig von der real vorhandenen Klasse eine Funktion aufrufen die es in der anderen nicht gibt(Wie in diesem Beispiel func2 aus abgel2), kannst du vorher mit dynamic_cast prüfen welche Klasse du eigentlich vor dir hast.<br />
dynamic_cast gibt entweder einen gültigen Zeiger zurück, falls es das entsprechende Objekt ist ansonsten 0, jedoch kann dieser Cast auch Exceptions werfen, die genauen Kriterien weiß ich jetzt nicht.</p>
<pre><code class="language-cpp">if(dynaic_cast&lt;abgel2*&gt;(p))
{
   p-&gt;func1();
   p-&gt;func2();
}
else
   p-&gt;func1();
</code></pre>
<p>So als Beispiel.</p>
<p>Möchtest du in einer aufgerufenen Klasse eine Funktion des Aufrufers verwenden, muss die Aufgerufene Klasse den Aufrufer natürlich können.</p>
<pre><code class="language-cpp">class cl2; // vorwärtsdeklaration
   class cl1
   {
      func(cl2 * c2)
       {
          c2-&gt;func();
       }
   }

   class cl2
   {
      ...
   }
</code></pre>
<p>Alternativ könntest du auch eine Programmstruktur überlegen in der du dieses Flaggedöns nicht brauchst, was ich persönlich vorziehen würde.</p>
<p>Bin mir nicht ischer ob ich dich richtig verstanden hab, hab aber einfach mal geantwortet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834762</guid><dc:creator><![CDATA[Kahino]]></dc:creator><pubDate>Fri, 08 Jan 2010 07:00:02 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Polymorphismus-&amp;gt;Problem mit Templates on Thu, 07 Jan 2010 23:30:31 GMT]]></title><description><![CDATA[<p>Warum überhaupt Laufzeitpolymorphie, wenn du schon zur Compilezeit (genauer gesagt schon beim Präprozessordurchlauf, deiner Flags nach) die konkrete Instanziierung kennst?</p>
<p>Du kannst natürlich keine Methoden aufrufen, die nicht einmal deklariert sind. Aber wenn die Klassen, die du als Template-Argumente einsetzt, eine bestimmte Schnittstelle erfüllen, kannst du deren Funktionen aufrufen und vor allem statisch binden.</p>
<pre><code class="language-cpp">class foo
{
    void problemfunc();
};

class bar
{
    void problemfunc();
};

template &lt;typename T&gt;
class tpl
{
    T* ptr;

    void func()
    {
        ptr-&gt;problemfunc();
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1834765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834765</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 07 Jan 2010 23:30:31 GMT</pubDate></item><item><title><![CDATA[Reply to Compiletime Polymorphismus-&amp;gt;Problem mit Templates on Fri, 08 Jan 2010 06:26:02 GMT]]></title><description><![CDATA[<p>Irgendwie denkt man da an c++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1834812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1834812</guid><dc:creator><![CDATA[kilokilo^]]></dc:creator><pubDate>Fri, 08 Jan 2010 06:26:02 GMT</pubDate></item></channel></rss>