c ++ int accessor возвращает 0, даже если мутатор установлен правильно - PullRequest
0 голосов
/ 16 января 2012

Я застрял в проблеме, из-за которой чувствую себя глупо, так как в основном это всего лишь две строки кода в середине работающего сценария ООП на 2000 строк.различная информация (имя, адрес, удостоверение личности).Проблема в том, что даже если идентификатор мутатора (установщика) устанавливает правильное значение (проверено cout и возвращаемым значением), метод доступа всегда возвращает 0.

// ID accessor
int Entity::ID() const {
    return _ID;     
}
// ID mutator
int& Entity::ID( int newID ) {
    if ( newID >= 0 ) {
        _ID = newID;
    }
    return _ID;
}

Вот мои классы (идентификатор (int)метод вызывается в AgencyNetwork :: createXXX () и используется в каждом методе toStr () (в конце каждого класса)):

Entity.cpp , AgencyNetwork.cpp , Agent.cpp

решено: Я забыл добавить идентификатор мутатора в каждый оператор =.Спасибо всем, кто помог:)

Ответы [ 2 ]

4 голосов
/ 16 января 2012

В частности, оператор присваивания 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;
}
0 голосов
/ 16 января 2012

Нет магии. Есть простой БАГ. Итак, давайте использовать трассировку: проследить каждый вызов мутатора. Убедитесь, что никто не может получить доступ к полю _ID другим способом, кроме как через вызов мутатора. Также вызывается конструктор трассировки, конструктор копирования, оператор присваивания копии и деструктор. Затем запустите свой код и следите за журналом трассировки. Я уверен, что все станет ясно в вашем случае.

ПРИМЕЧАНИЕ: если ваша реализация пропускает некоторые из функций-членов, упомянутых выше, вы должны определить их с помощью тел, состоящих только из вызова трассировщика.

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

...