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 поле.

Другие вопросы по тегам