Информация об изменениях

Сообщение Re[2]: общий ресурс от 19.12.2019 7:45

Изменено 19.12.2019 8:00 niXman

Re[2]: общий ресурс
Здравствуйте, Chorkov, Вы писали:

C>В случае детей, если я правильно понял, все внуки (дети детей) одинаковые и метод at возвращает одно ии тоже (вычисляемое) значение.

тип — один, но внуки могут ссылаться только на часть данных от предка. (на самом деле это дерево, и дети ссылаются на поддеревья)

C>Сделать две отдельных реализации myclass для родителя и для детей. (Шаблон проектирования p-impl.)

да, вариант. в конструкторе проверять, соответствует ли переданный указатель нулевому элементу вектора? — если нет — значит дите...

какие еще варианты?

т.е. что-то типа этого:
struct myclass {
    using element_type = int;
    using storage_type = vector<element_type>;

    struct base {
        virtual shared_ptr<storage_type> get_storage() = 0; // используется для создания детей
    };
    struct parent: base {};
    struct child: base {};

    myclass(...) // конструктор родителя
        :pimpl{new parent(...)}
    {}

    myclass(shared_ptr<storage_type> storage, const element_type *p, size_t size) // конструктор дитя
        :pimpl{new child(storage, p, size)}
    {}

private:
    base *pimpl;
};

(пока не компилил)
Re[2]: общий ресурс
Здравствуйте, Chorkov, Вы писали:

C>В случае детей, если я правильно понял, все внуки (дети детей) одинаковые и метод at возвращает одно ии тоже (вычисляемое) значение.

тип — один, но внуки могут ссылаться только на часть данных от предка. (на самом деле это дерево, и дети ссылаются на поддеревья)

C>Сделать две отдельных реализации myclass для родителя и для детей. (Шаблон проектирования p-impl.)

да, вариант. в конструкторе проверять, соответствует ли переданный указатель нулевому элементу вектора? — если нет — значит дите...

какие еще варианты?

т.е. что-то типа этого:
struct myclass {
    using element_type = int;
    using storage_type = vector<element_type>;

    struct base {
        virtual shared_ptr<storage_type> get_storage() = 0; // используется для создания детей
    };
    struct parent: base {};
    struct child: base {};

    myclass(...) // конструктор родителя
        :pimpl{new parent(...)}
    {}

private:
    myclass(shared_ptr<storage_type> storage, const element_type *p, size_t size) // конструктор дитя
        :pimpl{new child(storage, p, size)}
    {}

private:
    base *pimpl;
};

(пока не компилил)