Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

std::shared_ptr i usuwanie wszystkich wystąpień wskaźnika

Ostatnio zmodyfikowano 2026-06-02 12:58
Autor Wiadomość
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.

C/C++
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(); // jak to napisać?
       
editor->_list_panel->loadAll();
       
       
   
}
}
;
P-184154
DejaVu
» 2026-06-02 08:47:47
C/C++
_animations.clear();

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.
P-184155
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ć?

C/C++
void removeAnimationsFromObjects( std::shared_ptr < Animations > removedAnimations )
{
   
for( auto & object: _objects )
   
{
       
if( !object )
           
 continue;
       
       
if( object->getAnimations() == removedAnimations )
       
{
           
object->_animation = nullptr;
       
}
    }
}

P-184156
tBane
Temat założony przez niniejszego użytkownika
» 2026-06-02 09:08:43
A std::weak_ptr?


C/C++
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 );
}
P-184157
DejaVu
» 2026-06-02 09:13:48
Tak, trzeba wtedy użyć std::weak_ptr - tylko zostaną Ci na liście nullowe wpisy.
P-184158
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
P-184159
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.
C/C++
std::shared_ptr < Animations > Animator::getAnimations() {
   
return _animations.lock();
}
P-184160
« 1 »
  Strona 1 z 1