std::shared_ptr i usuwanie wszystkich wystąpień wskaźnika
Ostatnio zmodyfikowano 2026-06-02 12:58
tBane Temat założony przez niniejszego użytkownika |
std::shared_ptr i usuwanie wszystkich wystąpień wskaźnika » 2026-06-01 23:02:54 Cześć. Piszę program, którym mam pewne obiekty zapisane w głównej liście (animacje) i chce usunąć wszystkie odwołania do tych obiektów. std::vector < std::shared_ptr < Animations >> _animations; std::vector < std::shared_ptr < Object >> _objects;
_removeBtn->_onclick_func =[ ]() { if( !editor->_animations ) return; int animationID = animations_manager->getAnimationsID( editor->_animations->_path ); if( animationID >= 0 ) { removeAnimations( animationID ); removeAnimationsFromObjects(); editor->_list_panel->loadAll(); } }; |
|
DejaVu |
» 2026-06-02 08:47:47 Chyba, że chodzi Ci o usunięcie wszystkich miejsc w których są użyte animacje, ale nie ruszać listy _animations, tylko... w sumie o co Ci dokładnie chodzi? Bo odpięcie animacji od istniejących obiektów nie brzmi jak sensowny ficzer projektu. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2026-06-02 09:05:14 No chodzi o to, że każdy obiekt ma przypisaną animację. Chciałbym zrobic tak, że gdy kasuję animację z listy _animations, to żeby automatycznie shared_ptr<Animations> w obiekcie było nullptr. ChatGPT proponuje ręczne usuwanie ale czy nie da się tego jakoś zoptymalizować? void removeAnimationsFromObjects( std::shared_ptr < Animations > removedAnimations ) { for( auto & object: _objects ) { if( !object ) continue; if( object->getAnimations() == removedAnimations ) { object->_animation = nullptr; } } }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2026-06-02 09:08:43 A std::weak_ptr? std::vector < std::shared_ptr < Animations >> _animations; std::vector < std::shared_ptr < Object >> _objects;
class Object { public: std::weak_ptr < Animations > _animation; void setAnimation( std::shared_ptr < Animations > animation ) { _animation = animation; } std::shared_ptr < Animations > getAnimation() { return _animation.lock(); } };
void removeAnimations( int index ) { if( index < 0 || index >= _animations.size() ) return; _animations.erase( _animations.begin() + index ); }
|
|
DejaVu |
» 2026-06-02 09:13:48 Tak, trzeba wtedy użyć std::weak_ptr - tylko zostaną Ci na liście nullowe wpisy. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2026-06-02 09:17:00 o to właśnie chodziło :-) bo chcę kasować animacje z programu i wszystkie ich wystąpienia w prefabrykatach, tak żeby w prefabrykacie pozostało nullptr po usunięciu animacji |
|
tBane Temat założony przez niniejszego użytkownika |
» 2026-06-02 12:58:27 żeby konwertować std::weak_ptr na std::shared_ptr trzeba użyć funkcji .lock() np. std::shared_ptr < Animations > Animator::getAnimations() { return _animations.lock(); }
|
|
| « 1 » |