Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Chorkov, Вы писали:
C>>В случае детей, если я правильно понял, все внуки (дети детей) одинаковые и метод at возвращает одно ии тоже (вычисляемое) значение.
X>тип — один, но внуки могут ссылаться только на часть данных от предка. (на самом деле это дерево, и дети ссылаются на поддеревья)
C>>Сделать две отдельных реализации myclass для родителя и для детей. (Шаблон проектирования p-impl.)
X>да, вариант. в конструкторе проверять, соответствует ли переданный указатель нулевому элементу вектора? — если нет — значит дите...
Нет, нет, нет.
Вариант p-impl был предложен, потому что меня смутила строчка
{ m_ints.assign(p, size); }
Я предположил что вектор заполняется одинаковыми заначениями, и хотел заменить хранение на вычисляемое поле.
X>какие еще варианты?
Если дело именно в хранении права владения то два варианта:
Либо перейти на умные указатели в самом дереве — тогда никаких проблем: время жизни именно нужнного поддерева проблевается автоматически.
Либо дети должны продлевать время жизни родетельского контейнера :
struct myclass {
using element_type = int;
using storage_type = vector<element_type>;
myclass at(size_t index) {
element_type *p = ... // находим элемент по индексу
size_t size = ... // определяем размер
return {m_storage, p, size};
}
private:
myclasss(shared_ptr<storage_type> storage, const element_type *p, size_t size)
: m_storage(storage_type)
{ ... }
shared_ptr<storage_type> m_storage;
};
p-impl ненужен.