Qt sem ponteiros



  • é possível trabalhar com a api Qt sem usar ponteiros?

    @Object obj;
    obj.get()@

    ??



  • Dificil em... em alguns casos sim... em outros nao... ponteiros nao 'e tao dificil assim de aprender... depende muito do material que vc esta usando, no inicio 'e um pouco tenso, mas depois vc se acostuma...



  • Pois é, percebi que orientação a objetos com Qt só usando ponteiros, Qt usa ponteiros para tudo. O interesante é que.

    No caso então, todos os objetos gui de uma janela devem ser deletados manualmente?



  • Tudo depende... rs

    Ate onde eu sei, boa parte das linguagens de programa'cao utilizam pnteiros...

    Java, por exemplo usa, se voce programa emjava, vc usa muito e nem sabe, por toda vez que voce declara um objeto voce 'e obrigado a usar o construtor new que 'e responsavem em alocar ele na memoria, ou seja, voce nao consegue usar um objeto sem alocar ele...
    C++ lhe da essa liberdade, como no exemplo que vc usou ai...

    tem como simconstruir uma interface sem o uso de ponteiros, manualmente..

    Em rela'cao a sua pergunta, voce so 'e origado a deletar objetos alocados usando o construtor new pois, diferente do java, c++ nao possui "garbage Collector" (isso em java) que desaloca automaticamente objetos sem uso na memoria.

    Eu aconselho voce a aprender ponteiros, pois seu uso esta relacionado na boa utilizacao da memoria...



  • Aprendi o fundamental de ponteiros, e minha dúvida é justamente essa, se C++ permite trabalha com OO sem o uso de ponteiro não sei pq a Qt não.

    A dúvida que ainda tenho sobre ponteiros é em que casos reais de uso se faz necessário usar.

    se com

    @ Object obj;
    obj.get();
    @

    eu tenho o mesmo resultado

    pq eu faria

    @Object *obj
    obj = new Object()
    obj->get();@



  • Primeiro, se pergunte o que 'e um ponteiro...

    um ponteiro 'e uma variavel que armazena um endere'co de memoria...

    imagine um objeto, ele estaem uso, e ocupa 1mb da memoria,

    um ponteiro do mesmo tipo do objeto ocupa 4bytes que 'e o suficiente pra armazenar oendere'co do objeto...

    pensado assim, se eu precisar de uma informa'cao em um objeto que ja esta na memoria, preciso apenas do endere'co dele para referencialo...

    quando temos 5 objetos e usamos somente 2 porque o programa terminou a execu'cao antes por nao precisar dos outros 3, eu precisava ter criado os 5 na memoria? porque nao somente os 2?

    quando declaramos um ponteiro, ira existir apenas um bloco que armazena um endereco para um objeto na memoria, e esse endere'co esta vazio, entao, ele so passara a existir, quando um espaco na memoria for alocado e esse ponteiro armazenar ele na memoria, por isso o uso do new, ele cria o objeto na memoria e armazena o endere'co no ponteiro para ser usado....

    o exempo que vc mostrou 'e ruim, pq nao mostra a realutilidade do ponteiro....

    em relacao ao Qt permitir ou nao, em alguns aspectos o qt permite, outros nao, e voce tem que lembrar que o Qt 'e um framework e nao umalinguagem e para usa-lo voce tem que respeitar a forma comque ele foi implementado...



  • pois é, não me recordava da alocação dinâmica....
    então deve-se deletar todos os objetos GUI instanciados quando se cria uma janela com Qt?



  • Se voce declarar ela como um ponteiro, sim.



  • Você pode usar os objetos do Qt com e sem ponteiro. Mas como o QObject (e quem deriva dele) não tem "copy constructor", você não pode passar como parâmetro por valor. Por exemplo: isso não está errado:

    @
    int main(int argc, char **argv)
    {
    QGuiApplication app(argc, argv);

    AnalogClockWindow clock;
    clock.show();
    
    app.exec();
    

    }
    @

    Voccê pode usar & para "pegar" o ponteiro do objeto alocado na pilha e passar como parâmetro

    @
    int main()
    {
    QWidget window;
    QPushButton quit("Quit", &window);
    ...
    }
    @

    Para facilitar a vida, quando você cria um QObject com ponteiro e passa um pai (parent) para ele:

    @
    QObject * fatherObject=new QObject(0);
    QClass pmClass=new QClass(fatherObject);

    //...

    delete fatherObject;
    @

    Veja que ao deletar o fatherObject, o pmClass é deletado automaticamente pelo Qt . Isso é muito útil, por exemplo, com QWidgets. Imagina ter um treeview e ter que controlar "na mão" alocação e destruição dos itens (nós).



  • bq. Veja que ao deletar o fatherObject, o pmClass é deletado automaticamente pelo Qt . Isso é muito útil, por exemplo, com QWidgets. Imagina ter um treeview e ter que controlar “na mão” alocação e destruição dos itens (nós).

    ummmm e isso não pode ser conseguido sem ponteiro?

    tipo

    @ QObject fatherObject;
    QClass pmClass=new QClass(&fatherObject);

    @

    bq. Voccê pode usar & para “pegar” o ponteiro do objeto alocado na pilha e passar como parâmetro

     @int main()
     {
         QWidget window;
         QPushButton quit("Quit", &window);
         ...
     }@
    

    e fazendo assim não quebra o conceito de alocação dinâmica?



  • Poder, pode.

    Um problema que você precisa levar em consideração é: ao alocar os objetos só na pilha (sem alocação dinâmica / ponteiros), você está consumindo memória que também é usada para outros fins, como controlar as chamadas - call stack e passagem de parâmetros.

    Outro problema está no fato do tamanho. A pilha é relativamente pequena (o tamanho é controlado como parâmetro de compilação). Pode aumentar? Pode.

    Outra problema: performance. Na pilha, os objetos são descartados quando saem de escopo. Com isso você tem um overhead, objetos sendo criados e desalocados a todo momento. Num programa simples, não faz muita diferença. Mas em um grande sistema sim.

    Pra quem trabalha em sistemas embarcados, pilha é um recurso escasso.

    PS: Tenho essa preocupação em memória/performance, por conta do meu trabalho. As vezes sou até meio chato com isso. :)



  • sei,

    pode-se dizer então que deixar de usar ponteiros em c++ não é uma boa prática.

    ok, valeu pela explicação


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.