11 Stimmen

Copy Constructor mit temporärem Objekt benötigt

Der folgende Code funktioniert nur, wenn der Kopierkonstruktor verfügbar ist.

Wenn ich Druckanweisungen hinzufüge (über std::cout ) und den Kopierkonstruktor verfügbar zu machen, wird nicht verwendet (ich nehme an, dass es einen Compilertrick gibt, um die unnötige Kopie zu entfernen).

Aber sowohl bei der Ausgabe operator << und die Funktion plop() unten (wo ich ein temporäres Objekt erstelle), sehe ich keine Notwendigkeit für den Kopierkonstruktor. Kann jemand erklären, warum die Sprache es braucht, wenn ich alles per const-Referenz übergebe (oder was ich falsch mache).

#include <iostream>

class N
{
    public:
        N(int)  {}
    private:
        N(N const&);
};

std::ostream& operator<<(std::ostream& str,N const& data)
{
    return str << "N\n";
}

void plop(std::ostream& str,N const& data)
{
    str << "N\n";
}

int main()
{
    std::cout << N(1);     // Needs copy constructor  (line 25)
    plop(std::cout,N(1));  // Needs copy constructor

    N    a(5);
    std::cout << a;
    plop(std::cout,a);
}

Compiler:

[Alpha:~/X] myork% g++ -v
Integrierte Spezifikationen verwenden.
Ziel: i686-apple-darwin10
Konfiguriert mit: /var/tmp/gcc/gcc-5646~6/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4. 2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
Gewindemodell: posix
gcc Version 4.2.1 (Apple Inc. build 5646)

[Alpha:~/X] myork% g++ t.cpp
t.cpp: In der Funktion 'int main()':
t.cpp:10: Fehler: 'N::N(const N&)' ist privat
t.cpp:25: Fehler: innerhalb dieses Kontextes
t.cpp:10: Fehler: 'N::N(const N&)' ist privat
t.cpp:26: Fehler: innerhalb dieses Kontextes

Dies ist eine vereinfachte Version eines echten Codes.
Im echten Code habe ich eine Klasse, die eine std::auto_ptr enthält. Das bedeutet, dass ein Kopierkonstruktor, der eine Konstantenreferenz annimmt, nicht gültig ist (ohne einige Arbeit), und ich erhielt eine Fehlermeldung, die angab, dass der Kopierkonstruktor deshalb nicht verfügbar war:

Ändern Sie auch die Klasse:

class N
{
    public:
        N(int)  {}
    private:
        std::auto_ptr<int>  data;
};

Der Fehler ist dann:

t.cpp:25: Fehler: keine passende Funktion für den Aufruf von 'N::N(N)'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X