Konstruktorenverkettung bei Templates



  • Hallo!

    Ich habe dieses Template geschrieben:

    template <class T> class MyTemplate{
    public:
       MyTemplate(int value){
       }
    
       MyTemplate() : MyTemplate(10){
       }
    };
    

    Die parameterlose Version des Konstruktors soll den Konstruktor mit Parameter aufrufen und einen Default-Wert übergeben. Allerdings funktioniert das nicht. Er sagt mir dass diese Version des Konstruktors weder Element der Klasse noch der Basisklasse ist.

    Wie macht man das richtig?

    Danke!

    mfg



  • Hallo,

    am besten ist es, du verwendest Default-Parameter. Dann nimmt er, wenn du nichts angibst, 10 als Default-Wert und sonst eben das, was du mitgibst:

    template <class T> 
    class MyTemplate {
    private:
      int val_;
    
    public:
      MyTemplate(int value=10) : val_(value) { }
    };
    
    MyTemplate<int> a;  //val_ = 10
    MyTemplate<int> b(50);  //val_ = 50
    

    Es gibt im Übrigen auch cpp Tags, dann wird der Code gehighlighted.

    MfG

    GPC



  • Danke, werde es so machen.

    Aber rein interessehalber: es muss doch auch auf die andere Art gehen, oder? Was ist zum Beispiel, wenn ein Konstruktor 2 Parameter bekommt und die Summe der beiden an die Version mit nur einem Parameter weitergeben soll?

    mfg



  • ChrisR schrieb:

    Aber rein interessehalber: es muss doch auch auf die andere Art gehen, oder?

    Nein. So etwas geht in C++ nicht.

    Was ist zum Beispiel, wenn ein Konstruktor 2 Parameter bekommt und die Summe der beiden an die Version mit nur einem Parameter weitergeben soll?

    Stattdessen kannst du Folgendes tun:

    class foo
    {
        int value;
    
        void init(int v) { value = v; } // übernimmt die allgemeine Initialisierung.
    
        public:
            foo(int v1, int v2) 
            { 
                init(v1 + v2); // init mit v1 + v2 aufrufen.
            }
            foo(int v)
            {
                init(v); // init mit v aufrufen.
            }
    };
    

    Wobei du hier ebenfalls Default-Parameter verwenden kannst.

    Gruß Caipi


Anmelden zum Antworten