thanks, i made my own DeletionBroadcaster/Listener and a SafePointer-Template, seems to work fine.
In this case i cannot use ref. counted objects, because the class is a rich object (which file handles etc., memory) and its livinig time should not be bounded on components - living time.
Here is my DeletionBroadcaster/Listener and DeletionSafePointer (maybe a nice addition for JUCE):
[code]class DeletionBroadcaster;
class DeletionListener;
class DeletionListener
{
public:
virtual ~DeletionListener() {}
virtual void deletionListenerCallback (DeletionBroadcaster* source) = 0;
};
class DeletionBroadcaster
{
public:
DeletionBroadcaster();;
~DeletionBroadcaster();;
void addDeletionListener(DeletionListener* listener);;
void removeDeletionListener(DeletionListener* listener);
void sendDeletionMessage();;
private:
ListenerList deletionListeners;
bool deletionMessageSended;
};
class DeletionChecker : public DeletionListener
{
public:
DeletionChecker(DeletionBroadcaster* source_);;
~DeletionChecker();
bool isNotDeleted();;
void deletionListenerCallback(DeletionBroadcaster* source);;
private:
DeletionBroadcaster* broadcasterSource;
};
template
class DeletionSafePointer
{
public:
inline DeletionSafePointer (ObjectType* const objectToCare) throw()
: object (objectToCare) , deletionChecker(objectToCare)
{
}
inline ~DeletionSafePointer() { }
inline operator ObjectType*() throw()
{
if (deletionChecker.isNotDeleted())
{
return object;
} else
{
return 0;
}
}
inline ObjectType& operator*() throw()
{
if (deletionChecker.isNotDeleted())
{
return *object;
} else
{
return 0;
}
}
inline ObjectType* operator->() throw()
{
if (deletionChecker.isNotDeleted())
{
return object;
} else
{
jassertfalse;
return 0;
}
}
private:
ObjectType* object;
DeletionChecker deletionChecker;
};
template
bool operator== (const DeletionSafePointer& pointer1, ObjectType* const pointer2) throw()
{
return static_cast <ObjectType*> (pointer1) == pointer2;
}
template
bool operator!= (const DeletionSafePointer& pointer1, ObjectType* const pointer2) throw()
{
return static_cast <ObjectType*> (pointer1) != pointer2;
}
[/code]
[code]
DeletionChecker::DeletionChecker( DeletionBroadcaster* source_ ) : broadcasterSource(source_)
{
broadcasterSource->addDeletionListener(this);
}
DeletionChecker::~DeletionChecker()
{
if (isNotDeleted())
{
broadcasterSource->removeDeletionListener(this);
}
}
bool DeletionChecker::isNotDeleted()
{
return (broadcasterSource!=0);
}
void DeletionChecker::deletionListenerCallback( DeletionBroadcaster* source_ )
{
broadcasterSource=0;
}
DeletionBroadcaster::DeletionBroadcaster() : deletionMessageSended(false)
{
}
DeletionBroadcaster::~DeletionBroadcaster()
{
if (deletionMessageSended==false)
{
jassertfalse;
// Please call sendDeletionMessage in the destructor !!!
// ~myClass()
// {
// sendDeletionMessage();
// do other destruction
// };
sendDeletionMessage();
};
}
void DeletionBroadcaster::addDeletionListener( DeletionListener* listener )
{
deletionListeners.add(listener);
}
void DeletionBroadcaster::removeDeletionListener( DeletionListener* listener )
{
deletionListeners.remove(listener);
}
void DeletionBroadcaster::sendDeletionMessage()
{
deletionListeners.call(&DeletionListener::deletionListenerCallback,this);
deletionMessageSended=true;
}[/code]