2015-06-15 6 views
2

Я делаю копию при оптимизации записи для объекта (т. Е. При вызове конструктора-копии просто сохраняют указатель на объект и действительно копируют его только в том случае, если нам нужно изменить наш объект или если объект мы указывая на изменение).Конструктор неконтактной копии

Перед тем, как изменить наш объект, мы должны уведомить об этом других, чтобы они могли выполнить реальное копирование. Для этого действия я решил использовать шаблон наблюдателя:

struct subject { 
    void register_observer(const event& e, observer& obs); 
    void notify(const event& e) const; 

private: 
    std::map<event, std::vector<observer*> > _observers; 
}; 

и для наблюдателей:

struct observer { 
    virtual void onEvent(event e); 
}; 

тогда, наш объект наследует их обоих. Проблема заключается в том, что в копии-конструктор, необходимо вызвать register_observer, который неконстантная метод, когда мы получаем константный аргумент:

my_class::my_class(my_class const &other) { 
    if (other._copy != NULL) this->_copy = &other; 
    else { 
     this->_copy = other._copy; 
     this->_copy->register_observer(event::CHANGED, *this); 
    } 
} 

Одно из возможных решений, я обнаружил, использовать mutable, но я думаю, что это не подходит, потому что объект логически изменен.

Любые другие идеи?

+1

Объект не изменяется логически. С точки зрения пользователя в объекте ничего не изменилось. – Telokis

+1

Чтобы переформулировать то, что сказал @Ninetained, «mutable» - правильный выбор. –

+0

Почему бы вам не сделать, чтобы конструктор копирования принимал неконстантную ссылку? – juanchopanza

ответ

2

В вашем случае вы, вероятно, должны использовать ключевое слово mutable.

Ваш объект по-прежнему останется логически const, поскольку с точки зрения пользователя ничего не изменилось.

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