C++ int accessor возвращает 0, даже если мутатор установлен правильно
Я застрял в проблеме, из-за которой чувствую себя глупо, так как это всего лишь две строки кода в середине 2000-строчного работающего ООП-скрипта.
Переход к погоне - у меня есть класс Entity, который предоставляет различную информацию (имя, адрес, ID). Проблема в том, что даже если идентификатор мутатора (установщик) устанавливает правильное значение (проверено cout и возвращаемым значением), метод доступа всегда возвращает 0.
// ID accessor
int Entity::ID() const {
return _ID;
}
// ID mutator
int& Entity::ID( int newID ) {
if ( newID >= 0 ) {
_ID = newID;
}
return _ID;
}
Вот мои классы (метод ID (int) вызывается в AgencyNetwork::createXXX() и используется в каждом методе toStr() (в конце каждого класса)):
Entity.cpp, AgencyNetwork.cpp, Agent.cpp
Решено: я забыл добавить идентификатор мутатора в каждый оператор =. Спасибо всем, кто помог:)
2 ответа
В частности, оператор присваивания Entity
сломано:
Entity& Entity::operator= ( const Entity& tocopy ) {
delete this; // <<< don't do that
this -> name ( tocopy.name() );
this -> address ( tocopy.address() );
// <<< missing _ID
return *this;
}
Там нет магии. Есть простой БАГ. Итак, давайте использовать трассировку: проследить каждый вызов мутатора. Убедитесь, что никто не может получить доступ к полю _ID другим способом, кроме как через вызов мутатора. Также вызывается конструктор трассировки, конструктор копирования, оператор присваивания копии и деструктор. Затем запустите свой код и следите за журналом трассировки. Я уверен, что все станет ясно в вашем случае.
ПРИМЕЧАНИЕ: если ваша реализация пропускает некоторые из функций-членов, упомянутых выше, вы должны определить их с помощью тел, состоящих только из вызова трассировщика.
Вы не должны позволять компилятору генерировать какие-либо неявные функции-члены, чтобы быть уверенным, что вы полностью контролируете свой класс и особенно _ID
поле.