Почему Eclipse-CDT говорит, что самоназначение является ошибкой?

Я проводил модульный тест в eclipse g++, используя тест Google. Я получил ошибку, когда попытался провести модульное тестирование проверки самоназначения в классе, который я разработал.

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

CLASS operator=(const CLASS& rhs);

и когда я попытался сделать это в тесте:

CLASS A;
A = A;   //compile error here, saying self assignment to itself. have no clue why, though.

Интересно, есть ли какой-то особый способ самопроверки? Спасибо.

К вашему сведению, ниже снимок ошибки

введите здесь описание изображения


person Community    schedule 20.05.2014    source источник
comment
'Возникла бы ошибка' Не могли бы вы рассказать об этом, как обычно здесь, пожалуйста! На самом деле совершенно непонятно, о чем вы спрашиваете. Кроме того, множество тегов, которые вы указали, могут излишне сузить аудиторию, обращающую внимание на то, чтобы дать соответствующие ответы на ваш вопрос.   -  person πάντα ῥεῖ    schedule 20.05.2014
comment
уже поставил все, что у меня было в вопросе, хотя @πάνταῥεῖ   -  person    schedule 20.05.2014
comment
'говорит самоназначение самому себе' Это не сообщение об ошибке компилятора, которое я когда-либо видел! Кроме того, вы, похоже, неправильно поняли мои намеки на теги.   -  person πάντα ῥεῖ    schedule 21.05.2014
comment
@πάνταῥεῖ я тоже, и поэтому я обратился за помощью к этому сайту.   -  person    schedule 21.05.2014
comment
Есть ли в CLASS указатели, требующие глубокого копирования?   -  person Veritas    schedule 21.05.2014
comment
Скриншот покажите тогда пожалуйста (я такое редко прошу, но в данном случае может и имеет смысл). Если вы говорите «ошибка компиляции», отправьте сообщение здесь буквально. Если это не английское сообщение, по крайней мере, используйте переводчик, чтобы показать его в своем вопросе.   -  person πάντα ῥεῖ    schedule 21.05.2014
comment
@πάνταῥεῖ проверьте обновление..   -  person    schedule 21.05.2014
comment
Является ли ваш класс производным от какого-либо другого класса? Какие еще методы предоставляет ваш класс? Как реализован ваш operator=?   -  person Svalorzen    schedule 21.05.2014
comment
@Svalorzen для оператора =, он сначала проверит самоназначение. if(this == &rhs) вернуть *this; В противном случае просто сделайте по одной копии каждой переменной-члена внутри класса. все двойного типа.   -  person    schedule 21.05.2014
comment
@Svalorzen не является производным от другого класса.   -  person    schedule 21.05.2014
comment
Можешь показать класс?   -  person Veritas    schedule 21.05.2014
comment
Я совершенно не уверен в этом, но может быть, Eclipse пытается предотвратить ошибки для вас? Эта ссылка сообщает о функциях, очень похожих на то, с чем вы столкнулись: ibm.com/developerworks/library /j-кодан   -  person Svalorzen    schedule 21.05.2014
comment
@Veritas есть только конструктор по умолчанию и этот оператор =. Все переменные-члены являются двойными. Это оно. никаких других причудливых или сложных вещей   -  person    schedule 21.05.2014
comment
@Svalorzen, как решить эту проблему?   -  person    schedule 21.05.2014
comment
Я не использую Eclipse, я понятия не имею. Ссылка показывает страницу настроек, где вы можете настроить эти вещи. Я думаю, что вы должны найти это и понять все для себя.   -  person Svalorzen    schedule 21.05.2014
comment
@Svalorzen на самом деле, самостоятельная проверка назначения - это хорошо. однако здесь это не должно быть ошибкой. интересно, доступна ли какая-то настройка для моего конкретного требования.   -  person    schedule 21.05.2014
comment
CLASS operator=(const CLASS& rhs); не очень стандартно; он должен вернуть CLASS &. Если ваш копи-конструктор работает путем делегирования operator= (так не должно быть, но люди иногда так делают), то вас ждут некоторые неприятности.   -  person M.M    schedule 21.05.2014
comment
Проголосовали за открытие. Согласно моему ответу, информации достаточно, чтобы с высокой вероятностью диагностировать проблему.   -  person Mike Kinghan    schedule 21.05.2014


Ответы (1)


Оператор самоназначения x = x; это, конечно, не ошибка в C++, и здесь нет никакой ошибки компилятора.

Если вы запустите сборку своего проекта и посмотрите на вывод на вкладке Консоль IDE, а не на вкладке Проблемы, вы увидите, что компилятор не сообщает о таком ошибка. Если он не сообщит об ошибке, ваш проект будет построен успешно.

Если вы посмотрите на ошибку самоназначения, указанную на вкладке Проблемы, вы увидите, что ее ТипПроблема анализа кода, а не Проблема C/C++. Это означает, что о проблеме сообщает анализатор кода Eclipse CDT (Codan), а не компилятор.

Codan сообщает о самоназначении как об ошибке, потому что самоназначение почти всегда является ошибкой программирования. Но в вашем случае это намеренно.

У вас есть два варианта:

  • 1). Игнорировать ошибку анализа кода
  • 2). Измените настройки анализа кода проекта, чтобы об этой ошибке не сообщалось.

To do 2):

  • Перейдите в раздел Свойства -> Общие сведения о C/C++ -> Анализ кода.
  • Включите Использовать настройки проекта.
  • Either:-
    • Disable problem Assignment to itself, or
    • Выберите Назначить самой себе, затем перейдите в меню Настроить выбранное... -> Настройки и измените серьезность проблемы с Ошибка. на Предупреждение или Информация.
  • ОК вне проекта Свойства
person Mike Kinghan    schedule 21.05.2014
comment
Спасибо за ответ. Интересно, можно ли проверить самоназначение, не получая ошибки на этом этапе. причина в том, что самоназначение — это здорово, и я не хочу терять эту способность. - person ; 21.05.2014
comment
@STNYU Да, это так. Перечитайте ответ и обратите внимание, как преобразовать ошибку Codan в предупреждение или информацию. И повторю главное: что бы ни говорил Codan, компилятор все равно будет компилировать для вас самоназначения. - person Mike Kinghan; 21.05.2014