Отказ от копирования конструктора
Это может быть глупый вопрос, но...
Я писал ряд классов, в которых используются не копируемые элементы. Эти классы никогда не инициализируются через конструктор копирования в моем источнике. Когда я пытаюсь скомпилировать без предоставления своего собственного конструктора копирования, g++ выдает много ошибок о том, как он не может создать конструктор копирования по умолчанию из-за не копируемых объектов-членов.
Есть ли способ сказать компилятору просто не давать мне конструктор копирования?
РЕДАКТИРОВАТЬ: Да... чувствует себя глупо... У меня был случай, когда я случайно вызвал конструктор копирования в вызове boost::bind. Урок выучен.
5 ответов
Если вы на самом деле не вызываете конструктор копирования, тогда не будет ошибкой, если компилятор не сможет его сгенерировать. Похоже, вы (возможно косвенно) заставляете использовать конструктор копирования.
Вы можете подавить созданный компилятором один, объявив свой собственный конструктор копирования (вам не нужно определять его, если вы его не используете). Вы можете разместить его в private
раздел вашего класса.
Если это изменит ошибку, сказав, что конструктор копирования недоступен или вы получаете ошибки ссылки, то вы действительно вызываете использование копирующего конструктора, и вам нужно проанализировать, почему это так.
Обычный способ сделать вещи не копируемыми - объявить, но не определить конструктор копирования, и сделать его закрытым, чтобы ничто не могло его вызвать.
Следующая версия языка предоставит явный способ подавления этих сгенерированных функций.
Пока полностью не поддерживается новый стандарт C++ 0x, лучшее, что вы можете сделать, это объявить версию специальной функции-члена, но не реализовать ее. Обычно они делаются частными (чтобы было ясно, что их не следует использовать).
Class foo
{
// ... rest of definition
private:
foo (const foo& rhs); // Do Not Implement
const foo& operator= (const foo& rhs); // Do Not Implement
};
Не в текущей версии C++. В C++ 0x будет =delete;
синтаксис, чтобы сказать, что вам не нужна одна из специальных функций-членов, которые компилятор сгенерирует по умолчанию, если вы не определили ее самостоятельно.
Нет:)
Если вы хотите, чтобы ваш класс не копировался, используйте что-то вроде boost::noncopyable
class MyClass : private boost::noncopyable
{
}
или используйте параметризованный макрос в определении класса, который объявляет конструктор частной копии.