Warum sollte ich den Kopierkonstruktor und den Zuweisungsoperator privat machen und in C ++ implementieren?

7

Inspiriert von dieser Frage .

Normalerweise ist der Grund dafür, den Kopierkonstruktor und den Zuweisungsoperator private zu erstellen, , damit die Klasse nicht kopierbar gemacht werden kann dass Objekte nur erstellt und zerstört, aber nicht kopiert werden können - meistens, weil das Kopieren sinnlos wäre. In solchen Fällen werden der Kopierkonstruktor und der Zuweisungsoperator beide gemacht private und nicht implementiert - wenn die Klasse nicht kopierbar ist, dann sollte niemand kopieren.

Gibt es einen Fall, in dem Kopierkonstruktor und Zuweisungsoperator private sein müssen und gleichzeitig eine sinnvolle Implementierung haben?

    
sharptooth 25.07.2011, 11:14
quelle

3 Antworten

7

Zwei Fälle fallen mir sofort ein:

  1. friend s:

    Sagen Sie, dass Sie als Teil Ihres Designs zwei hoch gekoppelte Klassen haben, in denen man die anderen kopieren kann (etwa wie in einem Fabrikmodell oder Ähnlichem), aber Sie wollen das nicht lassen ganze Welt kann es kopieren.

  2. Wrapper:

    Nehmen wir an, Sie möchten ein Element je nach internem Verhalten (z. B. abhängig von einer Zustandsstatusbedingung) bedingt klonen können - der sauberste Weg aus der Sprachperspektive ist immer noch, das Kopieren in sein eigenes zu trennen Funktion. Dies würde eine gute Trennung der Interessen ermöglichen.

Nate 25.07.2011, 11:24
quelle
7

Ich schätze, dass dies für eine Klasse nützlich sein kann, die eine eigene Liste enthält - dann kann sie die Instanzen intern kopieren. Dies ist wirklich nur nützlich für eine Klasse, die sowohl das Element als auch den Container ist:

%Vor%

Ein anderer Gedanke ist, das Klonen in einem von der Klasse kontrollierten Zustand zu erlauben. Dies kann nützlich sein, wenn das Kopieren sinnvoll sein kann, aber nur unter bestimmten Bedingungen oder Berechtigungen:

%Vor%     
Eli Iser 25.07.2011 11:21
quelle
5
  1. Wir machen Kopierkonstruktor und operator = nicht implementiert, so dass sogar a friend kann keinen Zugriff darauf haben. Wenn Sie implementieren, bedeutet es Sie möchten, dass ein friend Zugriff hat. Dies ist eine Designentscheidung.
  2. Sie möchten explizit klonen ; d. h., es kann aber auch kopiert werden Machen Sie seinen Code "schmutzig" (so etwas wie C ++ - Casting) Operationen, die Schmutz in deinem Code zeigen )

z.B.

%Vor%

Wir haben diesen Wrapper clone() hinzugefügt, um dem Benutzer das Klonen zu ermöglichen, aber er zeigt auch explizit an, was genau er tut.

    
iammilind 25.07.2011 11:32
quelle