Clase plantilla wxObjectDataPtr< T >
plantilla<class T>
class wxObjectDataPtr< T >
Esta es una clase de plantilla auxiliar escrita principalmente para evitar fugas de memoria debido a la falta de llamadas a wxRefCounter::DecRef() y wxObjectRefData::DecRef().
A pesar de su nombre, esta plantilla se puede utilizar como puntero inteligente para cualquier clase que implemente la interfaz de recuento de referencias, que sólo consta de los dos métodos T::IncRef() y T::DecRef().
La diferencia con wxSharedPtr<T> es que wxObjectDataPtr<T> se basa en el recuento de referencias de la clase a la que apunta, mientras que wxSharedPtr<T> implementa el recuento de referencias por sí mismo.
A continuación se muestra un ejemplo que ilustra cómo implementar datos con recuento de referencias utilizando wxRefCounter y wxObjectDataPtr
class MyCarRefData: public wxRefCounter
{
public:
MyCarRefData( int price = 0 ) : m_price(price) { }
MyCarRefData( const MyCarRefData& data ) : m_price(data.m_price) { }
void SetPrice( int price ) { m_price = price; }
int GetPrice() const { return m_price; }
protected:
int m_price;
};
class MyCar
{
public:
// Inicializa este MyCar asignando al puntero de datos
// interno una nueva instancia de MyCarRefData.
MyCar( int price = 0 ) : m_data( new MyCarRefData(price) )
{
}
MyCar& operator =( const MyCar& tocopy )
{
// copia superficial: se trata simplemente de una copia rápida de
// punteros; ¡los datos reales que consumen memoria y que normalmente
// se almacenan dentro de MyCarRefData no se copian aquí!
m_data = tocopy.m_data;
return *this;
}
bool operator == ( const MyCar& other ) const
{
if (m_data.get() == other.m_data.get())
return true; // Esta instancia y la "otra" comparten
// los mismos datos MyCarRefData...
return (m_data.GetPrice() == other.m_data.GetPrice());
}
void SetPrice( int price )
{
// Asegura que los cambios en esta clase no afecten a otras instancias
// que actualmente comparten nuestros mismos datos con recuento de referencias:
UnShare();
m_data->SetPrice( price );
}
int GetPrice() const
{
return m_data->GetPrice();
}
wxObjectDataPtr<MyCarRefData> m_data;
protected:
void UnShare()
{
if (m_data->GetRefCount() == 1)
return;
m_data.reset( new MyCarRefData( *m_data ) );
}
};
Funciones miembro
wxObjectDataPtr()
template<class T > wxObjectDataPtr< T >::wxObjectDataPtr(T * ptr = nullptr)
Constructor.
ptr es un puntero al objeto con recuento de referencias al que apunta esta clase. Este objeto toma posesión de ptr, es decir, llamará a T::DecRef() sobre él si no es nulo cuando este objeto se destruya o se reinicie.
wxObjectDataPtr()
template<class T > template<typename U > wxObjectDataPtr< T >::wxObjectDataPtr(const wxObjectDataPtr< U > & tocopy)
Este constructor de copia aumenta el recuento del objeto con recuento de referencias al que apunta tocopy y, a continuación, esta clase también apuntará a él.
El uso de U diferente de T sólo es compatible desde wxWidgets 3.1.5.
wxObjectDataPtr()
template<class T > wxObjectDataPtr< T >::wxObjectDataPtr(const wxObjectDataPtr< T > & tocopy)
Este constructor de copia aumenta el recuento del objeto con recuento de referencias al que apunta tocopy y, a continuación, esta clase también apuntará a él.
El uso de U diferente de T sólo es compatible desde wxWidgets 3.1.5.
~wxObjectDataPtr()
template<class T > wxObjectDataPtr<: T >::~wxObjectDataPtr()
Disminuye el recuento de referencias del objeto al que apunta esta clase.
get()
template<class T > wxObjectDataPtr<: T >::get() const
Obtiene un puntero al objeto con recuento de referencias al que apunta esta clase.
release()
template<class T > wxObjectDataPtr<: T >::release()
Libera el puntero propietario, haciendo que el llamante sea responsable de decrementar su recuento de referencias.
Este método sólo debe utilizarse para interoperar con el código existente que trabaja con punteros sin formato, normalmente al devolver un puntero sin formato desde una función.
Después de llamar a esta función, este objeto deja de ser válido, es decir, ya no contiene ningún valor de puntero válido.
reset()
template<class T > wxObjectDataPtr<: T >::reset(T * ptr)
Restablece esta clase a ptr, que apunta a un objeto con recuento de referencias y llama a T::DecRef() en el objeto que se poseía anteriormente.
Operadores miembro
unspecified_bool_type()
template<class T > wxObjectDataPtr<: T >::operator unspecified_bool_type() const
Conversión a una expresión booleana (en una variante que no es convertible a nada más que una expresión booleana).
Si esta clase contiene un puntero válido, devolverá verdadero; si contiene un puntero nullptr, devolverá falso.
operator*()
template<class T > wxObjectDataPtr<: T >::operator*() const
Devuelve una referencia al objeto.
operator->()
template<class T > wxObjectDataPtr<: T >::operator->() const
Devuelve un puntero al objeto con recuento de referencias al que apunta esta clase.
Si el puntero interno es nullptr, este método se activará un assert en modo de depuración.
operator=(()
template<class T > wxObjectDataPtr<T>& wxObjectDataPtr< T >::operator=(const wxObjectDataPtr< T > & tocopy)
Operador de asignación.
El uso de U diferente de T solo es compatible desde wxWidgets 3.1.5.
operator=(()
template<class T >
template
Operador de asignación.
El uso de U diferente de T solo es compatible desde wxWidgets 3.1.5.
operator=(()
template<class T > wxObjectDataPtr<T>& wxObjectDataPtr< T >::operator=(T * ptr)
Operador de asignación.
El uso de U diferente de T solo es compatible desde wxWidgets 3.1.5.