Ir ao conteúdo
  • Cadastre-se

Chamar classe com função em outra - C++


Michel.

Posts recomendados

na verdade, foi só uma demonstração, inserindo o wxGauge, a compilação funciona normalmente, mais não é chamado quando executa

void MBRDlg::set()
{
wxDialog1->SetValue(40)
MessageBox(NULL,"FUNCIONOU","OK",MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
wxDialog1->SetValue(60)
MessageBox(NULL,"60","OK",MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
}

001glg.jpg

Link para o comentário
Compartilhar em outros sites

O problema é que compila normal mais não chama, esse Gauge nunca é setado, nem a Messagebox mostra...

ultimo tentado para chamar

 &MBRDlg::set;

compila mais não chama

se eu setar como Static no .h

	public:
MBRDlg(wxWindow *parent, wxWindowID id = 1, const wxString &title = wxT("MBR"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = MBRDlg_STYLE);
virtual ~MBRDlg();
void WxButton1Click(wxCommandEvent& event);
void WxButton2Click(wxCommandEvent& event);
void WxButton3Click(wxCommandEvent& event);
static void set();

e chamar dessa forma no .CPP

MBRDlg::set;

compila e chama tudo ok, mais não reconhece o Gauge e nem nenhuma dependencia do MBRDlg, dá esse erro

 invalid use of member `MBRDlg::WxGauge1' in static member function

se eu usar por exemplo uma Messagebox, chama normalmente, mais não "reconhece", o wxGauge nem o resto do GUI!

Link para o comentário
Compartilhar em outros sites

Cara, desde o começo eu falo sobre "OBJETO MBRDlg"...

Você só vai conseguir utilizar essa função se você efetivamente tiver um objeto MBRDlg.

Ou seja, só assim:


MBRDlg teste1( /*Entradas do construtor*/);
teste1.set();

Ou:


MBRDlg *teste2 = new MBRDlg( /*Entradas do construtor*/);
teste2->set();

A sua função em modo static, funciona porque não depende da existência de um objeto MBRDlg para executar, mas também não faz nada porque não existe nenhum objeto MBRDlg para poder acessar WxDialog1...

É que nem declarar uma variável como static dentro do obejto, você pode acessá-la sem precisar criar um objeto daquele tipo...

Link para o comentário
Compartilhar em outros sites

é aí que dá problema, tudo declarado nos mínimos detalhes

        MBRDlg dialog(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style);
dialog->set;

ou

        MBRDlg dialog();
dialog->set;

 151 C:\Users\Windows 7\Desktop\GUI\MBRDlg.cpp request for member `set' in `dialog', which is of non-class type `MBRDlg ()(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int)'

:(

EDIT

Consegui chamar assim

        MBRDlg *a = (MBRDlg *) p;
a->set();

funciona bem, mais o programa dá problema na hora de chamar, ele trava (app crash), se eu colocar outra instrução em vez de WxGauge que não seja do GUI, chama e executa perfeito, então quer dizer que essa instrução realmente chamou o objeto set...

o que você acha disso?

Link para o comentário
Compartilhar em outros sites

é aí que dá problema, tudo declarado nos mínimos detalhes

        MBRDlg dialog(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style);
dialog->set;

ou

        MBRDlg dialog();
dialog->set;

 151 C:\Users\Windows 7\Desktop\GUI\MBRDlg.cpp request for member `set' in `dialog', which is of non-class type `MBRDlg ()(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int)'

:(

Cara, da outra vez eu falei que essas entradas do contrutor são os tipos, você tem que ter elas declaradas em outro lugar...

Senão você vai criar uma MBRDlg aleatória, porque quando você escreve isso:

MBRDlg dialog(wxWindow *parent, wxWindowID id, const wxString &title, const wxPoint &position, const wxSize& size, long style);

Todas as variáveis de entrada estão sendo criadas na hora, ou seja, contém lixo de memória...

O certo é todas elas já existirem e você passá-las adequadamente...

E mais set é uma função...

Funções SEMPRE são acompanhadas de parênteses! ()

Ou seja:

MBRDlg teste(/*blablabla*/);
teste.set[B]()[/B];

EDIT

Consegui chamar assim

        MBRDlg *a = (MBRDlg *) p;
a->set();

funciona bem, mais o programa dá problema na hora de chamar, ele trava (app crash), se eu colocar outra instrução em vez de WxGauge que não seja do GUI, chama e executa perfeito, então quer dizer que essa instrução realmente chamou o objeto set...

o que você acha disso?

Acho o seguinte:

[B]MBRDlg *a = (MBRDlg *) p;[/B]/* Isso significa: "Converta 'p' para ponteiro para objeto do tipo MBRDlg e atribua a 'a' " */
[B][COLOR="Red"]Num sei nem como isso funcionou... provavelmente você tem um p declarado em algum lugar...[/COLOR][/B]
a->set(); /* Logicamente não funcionará pois p provavelmente não é um objeto MBRDlg nem ponteiro para um então não tem como chamar set() para um objeto MBRDlg inexistente */

Link para o comentário
Compartilhar em outros sites

Com isso funcionou bem

        MBRDlg *a = (MBRDlg *) p;
a->set();

Se eu colocar algo que não seja do GUI, funciona bem sem travar o programa, exemplo:

 void MBRDlg::set()
{
MessageBox(NULL,"TESTE","TESTE",MB_OK | MB_ICONINFORMATION | MB_TASKMODAL);
}

mais já isso trava o programa

 void MBRDlg::set()
{
WxGauge1->SetValue(100);
}

acho que tem que ser assim como nas outras funções que chamam algo do GUI

 void MBRDlg::set(wxCommandEvent& event)
{
WxGauge1->SetValue(100);
}

mais ao fazer isso

        MBRDlg *a = (MBRDlg *) p;
a->set(wxCommandEvent& event);

no matching function for call to `MBRDlg::set()'

candidates are: void MBRDlg::set(wxActivateEvent&)

tentei como o programa disse, mais não deu

e agora, como chamar isso?

void MBRDlg::set(wxCommandEvent& event)

Obrigado.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...