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:
class NonAssignable {
private:
NonAssignable(NonAssignable const&);
NonAssignable& operator=(NonAssignable const&);
public:
NonAssignable() {}
};
class SymbolIndexer: public Indexer, public NonAssignable {
};
Für GCC gibt dies die folgende Fehlermeldung aus:
test.h: In copy constructor ‘SymbolIndexer::SymbolIndexer(const SymbolIndexer&)’:
test.h: error: ‘NonAssignable::NonAssignable(const NonAssignable&)’ is private
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 :
class NonAssignable {
public:
NonAssignable(NonAssignable const&) = delete;
NonAssignable& operator=(NonAssignable const&) = delete;
NonAssignable() {}
};
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:
test.cpp: error: use of deleted function
‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
test.cpp: note: ‘SymbolIndexer& SymbolIndexer::operator=(const SymbolIndexer&)’
is implicitly deleted because the default definition would
be ill-formed:
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:
#include <boost/core/noncopyable.hpp>
class SymbolIndexer: public Indexer, private boost::noncopyable {
};
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 .