Konstruktorfrage



  • Hay
    Mir geht einfach nicht in den Kopf warum:

    class Test
    {
         private:
                  int i;
                  char c[20];
         public:
         Test::Test(int x)
          {
           i = x;
          strncpy(c,"Keine Eingabe",sizeof(c)-1);
          }
         // [...]
      }t1,t2;
    
    int main()
    {
    
        t1.print();
        t2(2); // Stünde hier Test t2(2) lässt es sich kompilieren. Aber warum?
        t2.print();
      // [...]
    return 0;
    }
    

    Das liefert für t1 die richtigen, durch den Standartkonstruktor initialisierten, Werte.
    Bei t2 krieg ich allerdings die Meldung: no match for call to '(test) (int)'



  • Falsches Forum: hier ist C+/CLI, eine .NET Sprache.
    Korrekt wäre: C++

    Simon



  • Dein Code kompiliert nicht, weil kein Konstruktor ohne Argumente zur Verfügung steht, Du ein solcher aber durch die Variablen t1 und t2 benötigst.

    Du musst deine Objekte mit einem der zur Verfügung stehenden Konstruktoren initialisieren:

    class Test
    {
    public:
       Test(int x) { /* .. */ }
    } t1(0), t2(1);
    

    Simon



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich nehme mal an, du hast auch einen Standardkonstruktor, d.h.

    class Test
    {
    public:
      Test() {}
    
      // ...
    
    } t1, t2;
    

    Nun sind t1 und t2 also schon konstruiert, d.h. du kannst dann nicht nocheinmal einen anderen Konstruktor mittels "t2(2);" aufrufen.
    Und "Test t2(2);" klappt, weil du dann zusätzlich eine lokale Variable gleichen Namens erzeugst.

    Wenn du Objekte dynamisch erzeugen willst, dann müßtest du Zeiger verwenden, z.B.

    Test *pTest;
    
    // irgendwann später im Programm
    
    pTest = new Test(42);
    
    ...
    
    // unterhalb oder noch irgendwo anders
    
    delete pTest;
    

Anmelden zum Antworten