Pregunta

Actualmente tengo una clase de formulario QT llamada `foo 'derivado de QMainWindow.

ahora en alguna otra clase, tengo algo como este

class someclass
{
   private:
      foo* form;
   ......
   public:
      someclass()
      {
          form = NULL; 
      }    
};

Ahora hay un método en Someclass que necesita saber si FOO * es válido si está apuntando a una forma foo válida.Quería saber cuál era la mejor manera de lograr esto.¿Debo ir con

if(form!=NULL) {...}

El problema es que el método anterior no guran a un formulario válido confiable.¿Alguna sugerencia?

¿Fue útil?

Solución

Creo que estás buscando punteros inteligentes. Por lo general, este cheque es realizado por un puntero débil. Esto no mantendría la propiedad para el objeto, pero podría verificar la validez con el MÉTODO DE ISNULL () .

QT tiene una clase conveniente establecida para esto, llamada qweakpointer . Se suele utilizar en pareja con punteros compartidos, que serían qsharedpointerer en el mundo qt.

La clase QWeakPointer tiene una referencia débil a un puntero compartido

El QWeakPointer es una referencia débil automática a un puntero en C ++. No se puede usar para diferenciar el puntero directamente, pero se puede usar para verificar si el puntero se ha eliminado o no en otro contexto.

QWeakPointer Los objetos solo se pueden crear mediante la asignación de un QSHAREDPointer.

Aquí va el método que realmente podría usar para ver si el principal QSharedpointer que posee el objeto ha eliminado el puntero referenciado.

bool qweakpointer :: isnull () const

devuelve VERDADERO si este objeto está sosteniendo una referencia a un puntero nulo.

Tenga en cuenta que, debido a la naturaleza de las referencias débiles, el puntero que las referencias de QWeakPointer puede convertirse en nulo en cualquier momento, por lo que el valor devuelto de esta función puede cambiar de Falso a VERDADERO de una llamada a la siguiente.

De esta manera, la otra clase no tendría que obtener una referencia al puntero con la propiedad, pero dependiendo de su caso de uso exacto, podría simplemente ir por QSharedPointer en todas partes.

Otros consejos

Utilice QSCOPEDPointer o QSharedPointer, dependiendo del alcance de la clase FOO en lugar de FOO *.Eso permitiría verificar de manera confiable si el puntero es válido, comparar el puntero a NULL no lo ayuda a detectar el puntero eliminado que apunta a la naturaleza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top