Eine Variable für mehrere Template-Klassen-Objekte



  • Hallo!
    Hab hier ein Problem, das ich nicht lösen kann.
    Ich hab eine Klasse, die mit einem Template arbeitet.

    template <class T>
    class CPU {
    ...
    };
    

    Jetzt will ich in der main() ein CPU Objekt eines bestimmten Typs haben (ergibt sich erst zur Laufzeit).
    Wie kann ich jetzt also eine Variable mycpu haben, die für jede erdenkliche CCPU Art stehen kann?

    TIA


  • Administrator

    Das geht nur über eine Basisklasse. Also sowas:

    class BasicCPU
    {
    public:
      virtual ~BasicCPU() { };
    
      // Die Funktionen aus CPU als virtual Funktionen ;)
    };
    
    template<typename T>
    class CPU
      : public BasicCPU
    {
      // ... überschreiben der virtuellen Funktionen.
    };
    

    Grüssli



  • Danke!
    Das Prob ist nur, dass die Methoden von der CPU teilweise Variablen vom Template Typ als Parameter erwarten.
    Das kann ich in der Basisklasse ja nicht definieren, kann ja nicht wissen was es alles sein wird.
    Wenn ichs jedoch in der Basisklasse nicht definiere, dann kann ichs nicht verwenden, weil der Compiler sich dann aufregt, dass die Basisklasse nicht diese Methode hat. 😡

    Weisst du da vl auch eine Lösung?

    TIA



  • Snafu schrieb:

    Das Prob ist nur, dass die Methoden von der CPU teilweise Variablen vom Template Typ als Parameter erwarten.

    Mit Templates kommst du schnell an die Grenzen, da diese zur Compilezeit ausgewertet werden.

    Kannst du deine Klassen nicht so strukturieren, dass du über eine polymorphe Basisklasse ein mehr oder weniger einheitliches Verhalten erzeugen kannst?

    // Eine mögliche Klassenhierarchie
    class Base {...}; // abstrakt
    class Derived1 : public Base {...};
    class Derived2 : public Base {...};
    
    // Die Base-Referenz kann nun auf Derived1 oder Derived2 zeigen. Mittels virtueller
    // Funktionen brauchst du dich gar nicht um Fallunterscheidungen zu kümmern.
    void Function(const Base& Var)
    {
        Var->Func(); // Es wird automatisch die richtige virtuelle Funktion aufgerufen,
                     // wenn du das entsprechend eingerichtet hast.
    }
    


  • Danke!
    Das Problem ist, dass es ein Programm für die Uni ist und ich es mit Generizität lösen MUSS.
    Ich kann also nur eine Wrapperklasse für den Templatetypen machen, und nur die Templates erlauben, die von diesem Typen abgeleitet sind, oder?
    Das macht die ganze Geschichte mit den Templates aber komplett sinnlos.



  • Ich bräuchte im Prinzip sowas hier:

    int main(int argc, char** argv)
    {
     ...
     CCPU<_WILDCARD_>* mycpu;
    
     ...
    
     if(x == 1)
      mycpu = new CCPU<int>;
     else if (...)
      ...
     else
      mycpu = new CCPU<EigeneKlasse>;
    
     ...
    
     delete mycpu;
    }
    

    Aber das geht soviel ich weiß leider nicht.


Anmelden zum Antworten