Отказ от копирования конструктора - PullRequest
1 голос
/ 27 апреля 2010

Это может быть глупый вопрос, но ...

Я написал несколько классов, в которых используются не копируемые элементы. Эти классы никогда не инициализируются через конструктор копирования в моем источнике. Когда я пытаюсь скомпилировать без предоставления своего собственного конструктора копирования, g ++ выдает много ошибок о том, как он не может создать конструктор копирования по умолчанию из-за не копируемых объектов-членов.

Есть ли способ сказать компилятору просто не давать мне конструктор копирования?

РЕДАКТИРОВАТЬ: Да ... чувствует себя глупо ... У меня был случай, когда я случайно вызвал конструктор копирования при вызове boost :: bind. Урок усвоен.

Ответы [ 5 ]

9 голосов
/ 27 апреля 2010

Обычный способ сделать вещи не копируемыми - объявить, но не определить конструктор копирования, и сделать его закрытым, чтобы ничто не могло его вызвать.

Следующая версия языка предоставит явный способ подавления этих сгенерированных функций .

6 голосов
/ 27 апреля 2010

Если вы на самом деле не вызываете конструктор копирования, тогда не будет ошибкой, если компилятор не сможет его сгенерировать. Похоже, вы (возможно косвенно) заставляете использовать конструктор копирования.

Вы можете подавить сгенерированный компилятором объявив свой собственный конструктор копирования (вам не нужно определять его, если вы его не используете). Вы можете разместить его в разделе private вашего класса.

Если это изменит ошибку, сказав, что конструктор копирования недоступен или вы получаете ошибки ссылки, то вы действительно вызываете использование копирующего конструктора, и вам нужно проанализировать, почему это так.

3 голосов
/ 27 апреля 2010

Пока полностью не поддерживается новый стандарт C ++ 0x, лучшее, что вы можете сделать, это объявить версию специальной функции-члена, но не реализовать ее. Обычно они делаются закрытыми (чтобы было ясно, что их не следует использовать).


Class foo
{
    // ... rest of definition
    private:
        foo (const foo& rhs); // Do Not Implement
        const foo& operator= (const foo& rhs); // Do Not Implement
};
3 голосов
/ 27 апреля 2010

Не в текущей версии C ++. В C ++ 0x будет синтаксис =delete;, сообщающий, что вам не нужна одна из специальных функций-членов, которые компилятор сгенерирует по умолчанию, если вы не определили ее самостоятельно.

2 голосов
/ 27 апреля 2010

Нет :)

Если вы хотите, чтобы ваш класс не был копируемым, используйте что-то вроде boost::noncopyable

class MyClass : private boost::noncopyable
{

}

или используйте параметризованный макрос в определении класса, который объявляет конструктор частной копии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...