Оператор присваивания не может быть сгенерирован, даже когда я перегружаю оператор = - PullRequest
5 голосов
/ 24 ноября 2010

Мой класс полиморфный, и его не следует использовать в любом случае. Он имеет член типа Font &, и в результате компилятор не может сгенерировать оператор =. Поэтому я только что создал фиктивные реализации конструктора присваивания и копирования, поместил их в приват класса, но он все равно предупреждает меня о том, что оператор присваивания не может быть сгенерирован. Как еще можно избавиться от этого предупреждения?

Спасибо

Предупреждение 9, предупреждение C4512: «AguiWidget»: оператор назначения не может быть создан c: \ users \ josh \ Documents \ visual studio 2008 \ projects \ agui \ alleg_5 \ agui \ aguiwidget.hpp 250

Ответы [ 3 ]

9 голосов
/ 24 ноября 2010

Оператор присваивания, о котором вас предупреждает компилятор, является оператором для вашего собственного класса.Теперь у вас есть:

AguiWidget& operator=(const AguiFont &tmp);

Что вам нужно:

AguiWidget& operator=(const AguiWidget &tmp);
3 голосов
/ 24 ноября 2010

Вы можете отключить его. Конечно, это не сработает, если вы на самом деле пытаетесь использовать эти операторы.

Вы уверены, что правильно поняли подписи? Вы сделали их для каждого класса, базы и производных?

2 голосов
/ 24 ноября 2010

Использование boost :: noncopyable .

class AGUI_CORE_DECLSPEC AguiWidget : private boost::noncopyable

Примечание:

boost :: noncopyable будет применяться также для всех подклассов.

EDIT:

Ух ты ... это один страшный класс ...

Используйте идиому pimpl , чтобы уменьшить взаимозависимость кода и улучшить читаемость интерфейса.

Также вы должны стараться избегать защищенных переменных-членов (насколько это возможно), так как это нарушает инкапсуляцию.

...