1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Kopierkonstructor Dev c++ vs. Visual Studio

Discussion in 'Programmieren' started by TheMars, Jan 15, 2009.

Thread Status:
Not open for further replies.
  1. TheMars

    TheMars Byte

    Hallo liebe Comunnity ;)
    ich möchte von Visual Studio 6 auf Dev C++ umsteigen und habe folgendes Problem:

    Code:
    class Klasse
    {
    public:
        Klasse() {} // Konstruktor
        Klasse(Klasse & Instanz) {} // Kopierkonstruktor
    };
    
    Klasse Funtkion()
    {
        return Klasse(); // leere Klasse zurückgeben
    }
    Funktioniert unter Visual Studio einwandfrei, Dev C++ sagt beim selben code:

    > In function `Klasse Funtkion()':
    > no matching function for call to `Klasse::Klasse(Klasse)'
    > candidates are: Klasse::Klasse(Klasse&)
    > [Build Error] [main.o] Error 1[/CODE]

    Wenn ich den Kopierkonstruktor wegnehme, funktioniert alles. :confused:
    Ich dachte mir dann, wenn er `Klasse::Klasse(Klasse)' haben will dann schreib ich das einfach dazu:

    Code:
    class Klasse
    {
    public:
        Klasse() {} // Konstruktor
        Klasse(Klasse Instanz) {} // ?Konstruktor 
        Klasse(Klasse & Instanz) {} // Kopierkonstruktor
    };
    Antwort von Dev C++:

    > invalid constructor; you probably meant `Klasse (const Klasse&)'
    > invalid member function declaration
    > [Build Error] [main.o] Error

    ich habe das dann dementsprechend verändert. Wenn ich jetzt aber eine Funktion der übergebenen Instanz aufrufen möchte wie hier:

    Code:
    class Klasse
    {
        void Methode() {}
    public:
        Klasse() {} // Konstruktor
        Klasse(const Klasse & Instanz) {Instanz.Methode();}
        Klasse(Klasse & Instanz) {} // Kopierkonstruktor
    };
    So meldet der Compiler:

    > In copy constructor `Klasse::Klasse(const Klasse&)':
    > passing `const Klasse' as `this' argument of `void Klasse::Methode()' discards qualifiers
    > [Build Error] [main.o] Error 1

    Was kann ich da tun? Stehe im Moment ziemlich auf dem Schlauch. :(
     
  2. xemebw

    xemebw Byte

    Wieso das nicht geht weiß ich nicht. Aus irgendeinem Grund wird ein Konstruktoraufruf ohne Zuweisung wohl nicht erlaubt oder es liegt woanders :confused:
    Zur Lösung deines Problems:
    Code:
    Klasse Funtkion()
    {
        Klasse result;
        return result;
    }
    
     
    Last edited: Jan 15, 2009
  3. TheMars

    TheMars Byte

    naja man könnte natürlich irgendwo eine Funktion schreiben die was ähnliches macht aber ein schöner stil ist das nicht -> verschlimmbessert. Da krieg ich bestimmt probleme im weiteren Verlauf, zumal das ursprungsprojekt in vc++ lief und ich so überall prüfen muss, ob das ohne weiteres Funktioniert.

    Code:
    class Klasse
    {
    public:
    	Klasse() {} // Konstruktor
    	Klasse(Klasse & Instanz) {} // Kopierkonstruktor
    };
    
    Klasse Funtkion()
    {
    [COLOR="Red"]    return Klasse();[/COLOR]
    }
    > no matching function for call to `Klasse::Klasse(Klasse)'

    Ich mache aber garkein call to Klasse::Klasse(Klasse) ich mache call to Klasse::Klasse(). :huh:
     
    Last edited: Jan 15, 2009
  4. xemebw

    xemebw Byte

    Was für eine Funktion, die was macht?
    Sry, versteh nicht, was du meinst...
     
  5. TheMars

    TheMars Byte

    wenn ich Klasse() aufrufe, dann will ich ja eigentlich eine Instanz des Typs "Klasse" zurückbekommen. So wie du oben beschrieben hast kann man sich ja eine Funktion basteln:

    Code:
    Klasse neuKlasse()
    {
          Klasse tmp;
          // hier nochmal dasselbe, was im Konstruktor steht
          return tmp;
    }
    aber warum - man wir doch wohl noch den Konstruktor einer Instanz aufrufen dürfen(!)
    wie oben schon beschreiben verstehe ich nicht, warum

    Klasse Instanz = Klasse();

    einen Aufruf von Klasse::Klasse(Klasse) erzeugt -> ich habe doch keinen Parameter angegeben "Klasse()" also wie kommt er (Compiler) dann darauf? :bse:

    PS: unter VC++ 6 geht das ohne Probleme
     
  6. TheMars

    TheMars Byte

    Interessanter weise wird Klasse::Klasse(const Klasse&) garnicht aufgerufen:

    Code:
    #include <iostream>
    class Klasse
    {
    public:
        Klasse() // Konstruktor
        {std::cout << "Klasse()";}
    
        Klasse(const Klasse & Instanz) // ?Konstruktor
        {std::cout << "Klasse(const Klasse & Instanz)";}
    
        Klasse(Klasse & Instanz) // Kopierkonstruktor
        {std::cout << "Klasse(Klasse & Instanz)";}
    };
    
    Klasse Funtkion() {return Klasse();}
    
    int main()
    {
        Funtkion();           // Ausgabe: Klasse()
        Klasse A;             // Ausgabe: Klasse()
        [COLOR="DarkRed"]Klasse B();           // Ausgabe: [/COLOR]
        Klasse C = Klasse();  // Ausgabe: Klasse()
        Klasse D = Klasse(C); // Ausgabe: Klasse(Klasse & Instanz)
        Klasse();             // Ausgabe: Klasse()
    }
    Ich habe davon zwar keine Ahnung, aber das riecht nach einem Compiler-Bug :grübel:
     
  7. xemebw

    xemebw Byte

    So wie ich es beschrieben habe, funktioniert es doch einwandfrei.
    Code:
    Klasse Funtkion()
    {
        Klasse result;
        //Und hier nichts mehr, der Konstruktor wird ja bei "Klasse result;" automatisch mitaufgerufen.
        return result;
    }
    Der Unterschied zu deiner Ursprungsversion besteht ja nur darin, dass der Befehl auf zwei Teile aufgeteilt und der Klasseninstanz der Name result gegeben wird.
     
  8. TheMars

    TheMars Byte

    Jepp, mein Fehler - das ist natürlich korrekt. :rolleyes:

    es ging mir nur darum das ich im Projekt überall Klasse(); verwendet habe und das jetzt nicht alles ersetzen will. Doch wie oben beschrieben reicht es hoffentlich aus einfach ein
    Code:
     
    Klasse(const Klasse & Instanz) {}
    hinzuzufügen, da dieses ja sowiso nicht aufgerufen wird. Vielleicht wird das ja in der nächsten Version von Dev C++ gefixt. ;)
     
Thread Status:
Not open for further replies.

Share This Page