У меня есть класс:
class SymbolIndexer {
protected:
SymbolIndexer ( ) { }
public:
static inline SymbolIndexer & GetUniqueInstance ( )
{
static SymbolIndexer uniqueinstance_ ;
return uniqueinstance_ ;
}
};
Как я должен изменить его, чтобы отключить код вроде:
SymbolIndexer symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
и разрешить только такой код:
SymbolIndexer & ref_symbol_indexer_ = SymbolIndexer::GetUniqueInstance ( );
c++
copy-constructor
Скромный отладчик
источник
источник
Ответы:
Вы можете сделать конструктор копирования закрытым и не предоставлять реализацию:
Или в C ++ 11, явно запретите это:
источник
delete
ключевого слова, я хотел бы добавить следующее. Моя текущая привычка при разработке нового класса заключается в том, чтобы сразуdelete
и конструктор копирования, и оператор присваивания. Я обнаружил, что, в зависимости от контекста, они по большей части не нужны, и их удаление предотвращает некоторые случаи неожиданного поведения. Если возникает ситуация, когда может потребоваться копия ctor, определите, можно ли это сделать с помощью семантики перемещения. Если это нежелательно, предоставьте реализацию для (!) Оператора копирования и оператора присваивания. Будь это хороший подход, я оставлю на усмотрение читателя.Если вы не возражаете против множественного наследования (в конце концов, это не так уж и плохо), вы можете написать простой класс с конструктором приватного копирования и оператором присваивания и дополнительно создать его подкласс:
Для GCC это дает следующее сообщение об ошибке:
Я не очень уверен, что это сработает в каждом компиляторе. Eсть связанный вопрос , но пока без ответа.
UPD:
В C ++ 11 вы также можете написать
NonAssignable
класс следующим образом:В
delete
Предотвращает ключевых слов членов от того по умолчанию возведенных, поэтому они не могут быть использованы в дальнейшем , по умолчанию , построенных членов Производный класса. Попытка присвоения дает следующую ошибку в GCC:UPD:
Boost уже имеет класс только для той же цели, я думаю, что он реализован аналогичным образом. Класс вызывается
boost::noncopyable
и предназначен для использования следующим образом:Я бы рекомендовал придерживаться решения Boost, если ваша политика проекта позволяет это. Смотрите также другой
boost::noncopyable
связанный вопрос для получения дополнительной информации.источник
NonAssignable(const NonAssignable &other);
?delete
синтаксиса ключевых слов C ++ 11 .delete
их, он перестает работать (я только что проверил).const Class&
иClass const&
довольно то же самое. Для указателей у вас может быть дажеClass const * const
тип.Сделай
SymbolIndexer( const SymbolIndexer& )
приватным. Если вы назначаете ссылку, вы не копируете.источник