оператор присваивания броска - PullRequest
0 голосов
/ 11 ноября 2018

C ++

Как вывести ошибку, когда кто-то вызывает оператор присваивания?

У меня есть базовый класс, который использует фабричный метод вместо конструктора. Методы фабрики считывают файл и вызывают конструктор производного класса на основе содержимого файла.

Base *a::create(file1);
Base *b::create(file2);

Я хочу выдать ошибку, если кто-то вызывает оператор присваивания.

*a = *b; // filetype contents don't match

В этот момент, когда вышеприведенное выполнено, содержимое моего * a перезаписывается * b. Я предполагаю, что он вызывает неявный оператор присваивания, чего я и не хочу.

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

test.cc:34:13: fatal error: 'operator=' is a private member of 'Test'
    *aa = *ad;
    ~~~ ^ ~~~
./Base.h:14:16: note: declared private here
    Base& operator=(const Base &rhs);
           ^
1 error generated.
make: *** [test] Error 1

Я бы хотел, чтобы вместо того, что показано выше, я выдал ошибку. Как «ты не можешь сделать это» или что-то.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 11 ноября 2018

Ошибки времени компиляции лучше, чем ошибки времени выполнения (потому что они мешают разработчику думать, что их код может работать, когда у него фактически нет шансов). Правильнее всего объявить непригодные операторы и конструкторы как частные или защищенные, чтобы их нельзя было использовать, кроме как friend s (например, фабриками).

...