Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
9 / 9 / 8
Регистрация: 08.11.2014
Сообщений: 215
Записей в блоге: 1
1

Путаница с weak_ptr

13.08.2018, 18:17. Показов 1102. Ответов 1
Метки нет (Все метки)

Есть класс Сущности и класс Компонента, необходимо сделать так, чтобы у каждой сущности были свои комоненты
Я пытался реализовать это так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class IEntity
{
protected:
    int id;
    std::vector<std::weak_ptr<IComponent>> Components;
 
public:
    IEntity();
    void addComponent(std::shared_ptr<IComponent> component)
    {
        Components.push_back(component);
    }
    virtual ~IEntity() = 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class IComponent : public std::enable_shared_from_this<IComponent>
{
protected:
    int id;
    std::string Name;
    std::shared_ptr<IEntity> entity;
 
public:
    IComponent(std::shared_ptr<IEntity> entity, int id, const std::string &name)
    {
        this->entity = entity;
        this->Name = name;
        this->id = id;
        this->entity->addComponent(shared_from_this());
    }
    virtual ~IComponent() = 0;
}
После создания объекта, класс которого наследуется от IEntity
C++
1
auto eobj = std::make_shared<EObject>();
Я создаю для него компонент, который наследуется от IComponent
C++
1
auto rh = std::make_shared<CRh>(eobj, IDGenerator::getId(), "b", eobj->getPosition()); //У конструктора CRh на один параметр больше, чем у базового класса
Но, когда я дохожу до добавления компонента к сущности
C++
1
this->entity->addComponent(shared_from_this());
Я получаю bad_weak_ptr

У меня есть предположение, что проблема кроется в методе shared_from_this(), ведь он даже у производных классов возвращает std::shared_ptr<IComponent>

Подскажите, пожалуйста, варианты решения проблемы
Если единственный выход - это каждый компонент наследовать от std::enable_shared_from_this<НовыйКомпонент>, то как лучше всего это реализовать?

P.S.: Описание и реализация методов были сделаны внутри класса для сокращения времени написания и простоты понимания
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2018, 18:17
Ответы с готовыми решениями:

Путаница с хэндлами при использовании FlashWindowsEx
Чтобы добиться одновременного мигания окна формы и её значка на панели задач приходится вызывать...

Weak_ptr и shared_ptr
Спасибо что зашли в эту тему и уделили мне время. Недавно увидел статью (не реклама)...

Как работает weak_ptr?
Уважаемые ! Читаю про умные указатели , тут столкнулся с такой проблемой, не могу понять как...

Weak_ptr | shared_ptr<Ty> lock() const;
Привет. Помогите ссылкой на реализацию weak_ptr, или хотя бы как написать функцию shared_ptr&lt;Ty&gt;...

1
494 / 208 / 70
Регистрация: 27.05.2016
Сообщений: 553
14.08.2018, 00:20 2
Лучший ответ Сообщение было отмечено avraal как решение

Решение

shared_from_this нельзя вызывать из конструктора. Отсюда это исключение.
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.08.2018, 00:20

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Field `.` has incomplete type boost::weak_ptr
Здравствуйте! Интересует вопрос: если член класса имеет тип weak_ptr, то требуется определение...

Использование умного указателя std::weak_ptr
Есть вот такой код иерархии классов. Нужно в последнем классе list, вместо динамического массива...

Аномальное поведение и shared_ptr weak_ptr enable_shared_from_this shared_from_this
Здравствуйте форумчане, самостоятельно изучаю C++ уже около года. Но время от времени натыкаюсь на...

Путаница в операторах
Что же возвращает 6-ая строка? BOOL String::Invariants() const { #ifdef SHOW_INVARIANTS...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.