Como saber se o Qt forma válida
-
22-12-2019 - |
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 ?
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.