Pergunta

Eu tenho atualmente um Qt classe de formulário chamado de `foo' derivado de QMainWindow.

Agora em alguma outra classe de eu ter algo parecido com isto

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

Agora existe um método em someclass que precisa saber se foo* é válido se ele está apontando para um válido foo formulário.Eu queria saber qual era a melhor maneira de alcançar isto.Devo ir com

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

O problema é que o método acima não garantir uma fiável de forma válida .Alguma sugestão ?

Foi útil?

Solução

Eu acho que você está procurando ponteiros inteligentes.Normalmente, esta verificação é feita por um fraco ponteiro.Este não detém a titularidade para o objeto, mas é possível verificar a validade com o isNull() método.

Qt dispõe de um conveniente classe estabelecido para esta chamada QWeakPointer.É normalmente usado em par com a partilha de ponteiros, o que seria QSharedPointer no Qt mundo.

O QWeakPointer classe possui uma referência fraca para um compartilhado ponteiro

O QWeakPointer é um sistema automático de fraco referência a um ponteiro em C++.Ele não pode ser usado para anular a referência de ponteiro diretamente, mas ela pode ser usada para verificar se o ponteiro foi excluído ou não em outro contexto.

QWeakPointer objetos só podem ser criados pela atribuição de uma QSharedPointer.

Aqui vai o método que você pode usar para ver se o principal QSharedPointer possuir o objeto foi excluído referenciado ponteiro.

bool QWeakPointer::isNull() const

Retorna true se o objeto está segurando uma referência a um ponteiro nulo.

Observe que, devido à natureza de referências fracas, o ponteiro que QWeakPointer referências podem tornar-se nulo, a qualquer momento, de modo que o valor retornado por essa função pode mudar de false para true, a partir de uma chamada para a próxima.

Desta forma, a outra classe, não teria necessidade de obter uma referência para o ponteiro com propriedade, mas dependendo do seu exata de caso de uso, você pode apenas ir para QSharedPointer em todos os lugares.

Outras dicas

Use QScopedPointer ou QSharedPointer dependendo do escopo da classe foo em vez de foo*.Que permitiria fiável verificar se o ponteiro é válido, comparando ponteiro para null não vai ajudar a detectar excluídos ponteiro apontando para a natureza.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top