Ich habe ein klasse :
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
Wie soll ich es ändern, um Code wie folgt zu deaktivieren:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
und erlauben Sie nur Code wie:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
c++
copy-constructor
Bescheidener Debugger
quelle
quelle
Antworten:
Sie können den Kopierkonstruktor privat machen und keine Implementierung bereitstellen:
Oder verbieten Sie es in C ++ 11 ausdrücklich:
quelle
delete
Schlüsselwort möchte ich Folgendes hinzufügen. Meine derzeitige Gewohnheit beim Entwerfen einer neuen Klasse besteht darin,delete
sofort sowohl den Kopierkonstruktor als auch den Zuweisungsoperator zu verwenden. Ich habe festgestellt, dass sie je nach Kontext meistens unnötig sind und das Löschen einige Fälle von unerwartetem Verhalten verhindert. Wenn eine Situation auftritt, in der möglicherweise ein Kopiercode benötigt wird, bestimmen Sie, ob dies mit der Verschiebungssemantik möglich ist. Wenn dies unerwünscht ist, stellen Sie eine Implementierung sowohl für (!) Den Kopierer als auch für den Zuweisungsoperator bereit. Ob dies ein guter Ansatz ist, überlasse ich dem Leser.Wenn Ihnen die Mehrfachvererbung nichts ausmacht (es ist schließlich nicht so schlimm), können Sie eine einfache Klasse mit einem Konstruktor für private Kopien und einem Zuweisungsoperator schreiben und diese zusätzlich unterordnen:
Für GCC gibt dies die folgende Fehlermeldung aus:
Ich bin mir jedoch nicht sicher, ob dies in jedem Compiler funktioniert. Da ist ein verwandte Frage , aber noch keine Antwort.
UPD:
In C ++ 11 können Sie die
NonAssignable
Klasse auch wie folgt schreiben :Das
delete
Schlüsselwort verhindert, dass Mitglieder standardmäßig erstellt werden, sodass sie in den standardmäßig erstellten Elementen einer abgeleiteten Klasse nicht weiter verwendet werden können. Der Versuch, eine Zuweisung vorzunehmen, führt in GCC zu folgendem Fehler:UPD:
Boost hat bereits eine Klasse nur für den gleichen Zweck, ich denke, sie ist sogar auf ähnliche Weise implementiert. Die Klasse wird aufgerufen
boost::noncopyable
und soll wie folgt verwendet werden:Ich würde empfehlen, an der Boost-Lösung festzuhalten, wenn Ihre Projektrichtlinie dies zulässt. Weitere Informationen finden Sie auch in einer anderen
boost::noncopyable
Frage .quelle
NonAssignable(const NonAssignable &other);
?delete
Schlüsselwortsyntax aktualisiert würde .delete
sie, funktioniert es nicht mehr (ich habe gerade überprüft).const Class&
undClass const&
sind ziemlich gleich. Für Zeiger können Sie sogarClass const * const
eingeben.Machen Sie
SymbolIndexer( const SymbolIndexer& )
privat. Wenn Sie einer Referenz zuweisen, kopieren Sie nicht.quelle