[Solved] Singleton



  • Bem, estou tentando implementar o padrão singleton em uma classe, porém estou tendo erros e também um alerta.

    Alerta:

    /home/Matheus/Projetos/QtOpitca-build-desktop/../QtOpitca/MdiChildClientes.h:0: warning: No relevant classes found. No output generated.

    Erros:

    /home/Matheus/Projetos/QtOpitca-build-desktop/MdiChildCliente.o:-1: In function MdiChildClientes::getMdiChiCli()': /home/Matheus/Projetos/QtOpitca/MdiChildCliente.cpp:-1: error: undefined reference toMdiChildClientes::objmdichicli'
    /home/Matheus/Projetos/QtOpitca/MdiChildCliente.cpp:-1: error: undefined reference to `MdiChildClientes::objmdichicli'
    :-1: error: collect2: ld returned 1 exit status

    Abaixo o código

    .cpp

    @#include "MdiChildClientes.h"

    MdiChildClientes::MdiChildClientes(QWidget *parent) : QWidget(parent)
    {
    setWindowTitle("Registro");
    setWindowIcon(QIcon(":/icoclientes"));
    setAttribute(Qt::WA_DeleteOnClose);
    }

    MdiChildClientes* MdiChildClientes::getMdiChiCli()
    {
    if(!objmdichicli)
    objmdichicli = new MdiChildClientes;

    return objmdichicli;
    

    }
    @

    .h

    @#ifndef MDICHILDCLIENTE_H
    #define MDICHILDCLIENTE_H

    #include <QWidget>

    class MdiChildClientes : public QWidget
    {

    public:

    static MdiChildClientes* getMdiChiCli();
    

    private:

    MdiChildClientes(QWidget *parent = 0);
    
    static MdiChildClientes *objmdichicli;
    

    };

    #endif // MDICHILDCLIENTE_H
    @

    Agradeço a ajuda amigos



  • Although I do not really understand Portuguese I can tell you that static data members of classes have to be defined outside class declarations in namespace scopes.

    .cpp has to read
    [quote author="matheusssilva_BR" date="1309638445"]
    @#include "MdiChildClientes.h"

    MdiChildClientes* MdiChildClientes::objmdichicli = 0; // <- definition of the static data memeber

    MdiChildClientes::MdiChildClientes(QWidget *parent) : QWidget(parent)
    {
    setWindowTitle("Registro");
    setWindowIcon(QIcon(":/icoclientes"));
    setAttribute(Qt::WA_DeleteOnClose);
    }

    MdiChildClientes* MdiChildClientes::getMdiChiCli()
    {
    if(!objmdichicli)
    objmdichicli = new MdiChildClientes;

    return objmdichicli;
    

    }
    @



  • [quote author="matheusssilva_BR" date="1309638445"]
    Alerta:

    /home/Matheus/Projetos/QtOpitca-build-desktop/../QtOpitca/MdiChildClientes.h:0: warning: No relevant classes found. No output generated.
    [/quote]

    Quem emite esse warnign é o moc, quando processa uma classe que não precisa de ação alguma dele (não implementa sinais/slots e não tem a macro Q_OBJECT).

    Você colocou a macro Q_OBJECT nessa classe e depois a removeu? Pode ter sido essa a causa desse warning. Mas não se preocupe, o fato dele estar aparecendo não influencia sua aplicação e esse aviso deve sumir quando rodar qmake novamente.



  • Lukas, thank you. I'm still getting used to the differences in C + + to Java. I come from Java.

    anselmo, vlw por mais essa tio. A única queixa que eu tenho do gcc é que as mensagens de erro e alertas não são muito claras. Visual C++ é bem mais claro.



  • "tio" também já é demais né :-P



  • 1º Como faço para deletar esse ponteiro stático criado? Eu tentei deletar no destrutor da classe mas fecha toda a aplicação e me retorna um erro de fechamento inesperado.

    2º Essa é uma classe que será um Frame Interno (SubWindow) de uma aplicação MDI. Resolvi implementar o padrão Singleton para impedir que um usuários abras várias instâncias da mesma janela ao mesmo tempo. Porém alguns amigos me disseram que não precisava tudo isso. Sendo assim, como faço para saber se já existe uma instância de uma determinada janela aberta em uma QMdiArea? E caso exista traga a mesma pra frente (caso exista outras coisas abertas na QMdiArea)?


Log in to reply
 

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