Re[3]: общий ресурс
От: Chorkov Россия  
Дата: 19.12.19 08:25
Оценка:
Здравствуйте, 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 ненужен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.