2012-01-16 3 views
0

Я застрял в проблеме, я чувствую себя глупо, так как это всего лишь две строки кода в середине работающего сценария ООП в 2000 году.C++ int accessor return 0, даже если мутатор правильно настроен

Отрезать погоню - у меня есть класс Entity, который предоставляет различную информацию (имя, адрес, идентификатор). Проблема в том, - даже если ID мутатор (сеттер) устанавливает правильное значение (протестировано с соиЬ и возвращаемого значения), аксессор всегда возвращает 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

РЕШИТЬ: Я забыл добавить идентификатор мутатор в каждом операторе =. Спасибо всем, кто помог :)

+4

Любой маленький, автономный образец, который воспроизводит проблему? –

+0

uhm yeah, AgentNetwork.ccp строка 139 - это вызов мутатора, а строка 275 Agent.cpp - это вызов для аксессора. Надеюсь, это то, что вы делаете по образцу. Просто наличие мутатора/аксессора из «в дикой природе» не имеет смысла, я думаю, что это OOP :) – Asmodiel

+0

Неверно возвращать 'int &' из функции-члена 'mutator'. Попробуйте вернуть plain 'int'. – DaddyM

ответ

4

В частности, оператор присваивания из 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

Здравствуйте, Georg, спасибо, что указал, я забыл об этом, но, к сожалению, это не исправить проблему:/ – Asmodiel

+0

Здравствуйте, Георг! Теперь он работает - проблема была в операторе = всех классов, я просто забыл добавлять идентификатор повсюду. Спасибо! – Asmodiel

+1

@Asmodiel, не забывайте про другую ошибку. Не делайте 'delete this'. Кроме того, вы, вероятно, не должны писать свой собственный 'operator =' в этом случае. В этом случае компилятор обеспечит разумное умолчание, потому что вы используете члены, которые являются 'string' и' int'. Фактически, если класс был спроектирован таким образом, что требуется пользовательский 'operator =' (например, 'char *' вместо строки), тогда я попытался бы изменить дизайн вместо этого! –

0

Там нет никакой магии. Существует простой BUG. Таким образом, позволяет использовать трассировку: отслеживать каждый вызов «мутатор». Убедитесь, что никто не может получить доступ к полю _ID иначе, чем через вызов мутатора. Конструктор трассировки, конструктор копирования, оператор присваивания копий и вызовы деструктора. Затем запустите свой код и следуйте за журналом трассировки. Я уверен, что в вашем случае все станет ясно.

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^