Ir ao conteúdo
  • Cadastre-se

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


Michel.

Posts recomendados

Olá, tenho o seguinte código


void MBRDlg::Set()
{
WxGauge1->SetValue(40);
}

DWORD WINAPI Thread( LPVOID lpParameter)
{
system("%WINDIR%\\\SYSTEM32\\bcdedit -set testsigning off");
[B][COLOR="Navy"] //Como Chamar MBRDlg::Set ?
void MBRDlg::Set(); // não deu
void MBRDlg::Set() // também não deu[/COLOR][/B]
{
return 0;
}
}

Link para o comentário
Compartilhar em outros sites

1- A tag de código é CODE e não QUOTE.

2- Você quer chamar uma função, ou declará-la dentro de outra???

Presta atenção no que você está fazendo...

DWORD WINAPI Thread( LPVOID lpParameter)
{
system("%WINDIR%\\\SYSTEM32\\bcdedit -set testsigning off");
COMO IR PARA MBRDlg::Set ?
[B]void MBRDlg::Set(wxCommandEvent& event); // não deu :/
{
return 0;
}[/B]
}
[B]void MBRDlg::Set(wxCommandEvent& event)
{
WxGauge1->SetValue(40);
}[/B]

Link para o comentário
Compartilhar em outros sites

Tipo isso


void MBRDlg::Set()
{
WxGauge1->SetValue(40);
}

DWORD WINAPI Thread( LPVOID lpParameter)
{
system("%WINDIR%\\\SYSTEM32\\bcdedit -set testsigning off");
[B][COLOR="Navy"] //Como Chamar MBRDlg::Set ?
void MBRDlg::Set(); // não deu
void MBRDlg::Set() // também não deu[/COLOR][/B]
{
return 0;
}
}

Link para o comentário
Compartilhar em outros sites

Com isto

MBRDlg::Set()

Dá esse erro

 cannot call member function `void MBRDlg::Set()' without object

:/

Você não tem que colocar algo nos parâmetros dele não?

Edit:

Acabei de ver a declaração, não sei se você precisa adicionar algo aos parâmetros, mas desculpe, não sei como arrumar ai

Link para o comentário
Compartilhar em outros sites

Você não tem que criar um objeto MBRDlg e depois chamar set não?

Algo do tipo:

MBRDlg teste;
teste.Set();

Então, havia tentado isso, mais dá esse problema;

        MBRDlg dialog; // Dá problema aqui
dialog.Set();

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

note, candidates are: MBRDlg::MBRDlg(const MBRDlg&)

MBRDlg::MBRDlg(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int)

[Warning] no return statement in function returning non-void

Obrigado por tudo.

Link para o comentário
Compartilhar em outros sites

Então, havia tentado isso, mais dá esse problema;

        MBRDlg dialog; // Dá problema aqui
dialog.Set();

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

note, [B]candidates are: MBRDlg::MBRDlg(const MBRDlg&)

MBRDlg::MBRDlg(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int)[/B]

[Warning] no return statement in function returning non-void

Obrigado por tudo.

Cara... é só ler o erro... tá claro que você é obrigado a passar algo pro construtor... peloamordedeus...

tem que ser algo do tipo:


MBRDlg dialog( /*entradas do construtor */ );

Link para o comentário
Compartilhar em outros sites

Beleza cara, na hora de compilar veio mais essa, aff, não tenho sorte com programação;

        MBRDlg dialog(const MBRDlg&);
dialog.Set(); //Deu problema aqui

request for member `Set' in `dialog', which is of non-class type `MBRDlg ()(const MBRDlg&)'

tentei assim também;

        MBRDlg dialog();
dialog.Set(); //Deu problema aqui

:(

Link para o comentário
Compartilhar em outros sites

Beleza cara, na hora de compilar veio mais essa, aff, não tenho sorte com programação;

        MBRDlg dialog(const MBRDlg&);
dialog.Set(); //Deu problema aqui

request for member `Set' in `dialog', which is of non-class type `MBRDlg ()(const MBRDlg&)'

tentei assim também;

        MBRDlg dialog();
dialog.Set(); //Deu problema aqui

:(

Cara... olha o que você está escrevendo...

MBRDlg dialog(const MBRDlg&);

Sério mesmo, pára de fazer as coisas correndo e lê!

MBRDlg::MBRDlg(const MBRDLg &);

Significa que o construtor de MBRDlg pode receber uma referência para OUTRO objeto do tipo MBRDlg e copiar seus atributos...

E a referência é do tipo constante (const) pois o objeto será só copiado e não terá nenhuma alteração.

Como você quer criar um novo, vai precisar passar pro construtor todos os outros parâmetros:

MBRDlg::MBRDlg(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int)

Ou seja, um ponteiro para wxWindow, um wxWindowID, uma referência a wxString (basta escrever o nome da variável do tipo wxString), uma referência a wxPoint (idem), uma referência a wxSize (idem) e um inteiro longo...

Agora que valores eles representam você vai precisar ler a descrição para saber o que tem que ter em cada um...

Link para o comentário
Compartilhar em outros sites

Cara... olha o que você está escrevendo...

MBRDlg dialog(const MBRDlg&);

Sério mesmo, pára de fazer as coisas correndo e lê!

MBRDlg::MBRDlg(const MBRDLg &);

Significa que o construtor de MBRDlg pode receber uma referência para OUTRO objeto do tipo MBRDlg e copiar seus atributos...

E a referência é do tipo constante (const) pois o objeto será só copiado e não terá nenhuma alteração.

Como você quer criar um novo, vai precisar passar pro construtor todos os outros parâmetros:

MBRDlg::MBRDlg(wxWindow*, wxWindowID, const wxString&, const wxPoint&, const wxSize&, long int)

Ou seja, um ponteiro para wxWindow, um wxWindowID, uma referência a wxString (basta escrever o nome da variável do tipo wxString), uma referência a wxPoint (idem), uma referência a wxSize (idem) e um inteiro longo...

Agora que valores eles representam você vai precisar ler a descrição para saber o que tem que ter em cada um...

Certo, mais na verdade, eu não entendi como vou aplicar isso no código :/

Assim, queria chamar esse MBRDlg::Set para poder setar o valor WxGauge1->SetValue(40); apenas, se houvesse uma forma de fazer isso dentro dessa DWORD, seria até melhor...

Link para o comentário
Compartilhar em outros sites

Certo, mais na verdade, eu não entendi como vou aplicar isso no código :/

Assim, queria chamar esse MBRDlg::Set para poder setar o valor WxGauge1->SetValue(40); apenas, se houvesse uma forma de fazer isso dentro dessa DWORD, seria até melhor...

1-WxGauge é um objeto do tipo MBRDlg???

2-Se for de MBRDlg, você não pode definir uma MBRDlg::Set pelo simples fato de que ela sequer é mencionada no .h dela.

Link para o comentário
Compartilhar em outros sites

1-WxGauge é um objeto do tipo MBRDlg???

2-Se for de MBRDlg, você não pode definir uma MBRDlg::Set pelo simples fato de que ela sequer é mencionada no .h dela.

Sim, está corretamente definida no .h do programa, , e o WxGauge ( ou barra de progresso (progressbar) ), faz parte do GUI do programa, então, depois de completar um processo, setaria essa WxGauge para 40;

A instrução

WxGauge1->SetValue(40);

funciona corretamente em

MBRDlg::WxButton1Click(wxCommandEvent& event)

que executa ainstrução quando o botão é apertado...

Link para o comentário
Compartilhar em outros sites

Sim, está corretamente definida no .h do programa,

Se ela já está definida pra que você quer declará-la de novo?

, e o WxGauge ( ou barra de progresso (progressbar) ), faz parte do GUI do programa, então, depois de completar um processo, setaria essa WxGauge para 40;

A instrução

WxGauge1->SetValue(40);

Fazer parte do GUI difere em muito de estar contida dentro do objeto MBRDlg

Tem como você me passar o .h para eu ver?

E o .cpp também caso você tenha separado a definição da classe das funções membro.

-

Link para o comentário
Compartilhar em outros sites

Pois é, faz parte da "interface gráfica" do programa, ao acabar de setar alguns comandos usando system(""), queria setar a WxGauge para 40

Lembrando que os comandos são executados em um Thread para não travar o programa na hora de apertar o botão...

A .h do programa estou enviando por MP agora, valeu.

Link para o comentário
Compartilhar em outros sites

Pelo visto MBRDlg herda de wxDialog.

Mas MBRDlg NÃO tem uma função Set() definida...

Só se ela existir em wxDialog para MBRDlg ter conhecimento dela...

Ela existe em wxDialog?

Bom, na verdade, o código que te enviei, foi o código real do programa

Na realidade, no programa, há

void MBRDlg::SfixSet()

como você viu ele definido no código

WxGauge está definido em MBRDlg, por isso, não posso definir em uma Thread, por isso que queria chamar uma função com a classe MBRDlg para setar esse WxGauge...

Link para o comentário
Compartilhar em outros sites

Bom, na verdade, o código que te enviei, foi o código real do programa

Na realidade, no programa, há

void MBRDlg::SfixSet()

como você viu ele definido no código

(...)

Sim, o que quero dizer é o seguinte:

wxGauge é um elemento PRIVATE, ou seja, você não vai conseguir fazer algo do tipo:

MBRDlg dialog(/*blablabla*/);
[COLOR="Red"][B]dialog.WxGauge1->setValue(40);[/B][/COLOR] /*ERRADO!*/

Você precisa de uma função do tipo public que execute wxGauge1->setValue(40);

(...)queria chamar uma função com a classe MBRDlg para setar esse WxGauge...

Você só vai conseguir fazer isso alterando MBRDlg e incluindo sua função Set();

A menos que MBRDlg tenha herdado uma função que faça isso...

WxGauge está definido em MBRDlg, por isso, não posso definir em uma Thread,

Na verdade a definição dele está em outro lugar...

MBRDlg só declara uma variável daquele tipo...

Link para o comentário
Compartilhar em outros sites

É, complicou mesmo, se eu der a instrução nessa parte do código

void MBRDlg::WxButton1Click(wxCommandEvent& event)
{
WxGauge1->setValue(40);
}

O código funciona corretamente, porém não posso fazer isso, porque para setar esse wxGauge1, tem que esperar que as operações sejam concluidas, é que nem o setup de um programa, e tal...

O wxGauge está setado nessa parte do código

void MBRDlg::CreateGUIControls()
{
WxGauge1 = new wxGauge(this, ID_WXGAUGE1, 140, wxPoint(90, 111), wxSize(150, 17), wxGA_HORIZONTAL, wxDefaultValidator, wxT("WxGauge1"));
WxGauge1->SetRange(140);
WxGauge1->SetValue(0);
}

Então, só não estou conseguindo seta-la, porque estou atuando em uma Thread em cascata, ou seja, fica executando outras operações em uma mesma função para não travar o programa

void MBRDlg::WxButton1Click(wxCommandEvent& event)
{
DWORD WINAPI Sfix( LPVOID lpParameter);
DWORD dwThreadID;
WxStaticText2->SetLabel("Fixing core activation files");
CreateThread(0,0,Sfix,0,0,&dwThreadID);

[code]WxGauge1->setValue(40); // se ela estivesse aqui, daria

}

DWORD WINAPI Sfix( LPVOID lpParameter )

{

system Blablabla

WxGauge1->setValue(40); // não dá

{

Link para o comentário
Compartilhar em outros sites

Cara, é tudo questão de definir uma função set() DENTRO do objeto MBRDlg...

Essa função TEM que ter o protótipo mencionado no .h e depois ser corretamente declarada no .cpp da .h ou no .cpp da main...

Eu tentei te dizer isso indiretamente...

Você chamar wxDialog1->SetValue(40) DENTRO daquela função de clique funciona porque ela FAZ PARTE do objeto MBRDlg, tentar chamar isso em qualquer outro lugar não vai funcionar por duas coisas:

1- wxDialog1 é PRIVATE, ou seja, só funções do objeto podem acessá-la!

2- Escrever wxDialog1->SetValue(40); em qualquer outro lugar não faz sentido... primeiro porque você com certeza não declarou um wxDialog1 independente de um objeto MBRDlg e segundo porque não se tem referência alguma ao objeto ao qual wxDialog1 pertence e mesmo que tivesse não funcionaria pelo que disse acima em "1"...

Link para o comentário
Compartilhar em outros sites

Se ela não estivesse declarada, nem compilaria o programa,

no .H

#ifndef __MBRDLG_H__
#define __MBRDLG_H__

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include <wx/wx.h>
#include <wx/dialog.h>
#else
#include <wx/wxprec.h>
#endif

//Do not add custom headers between
//Header Include Start and Header Include End.
//wxDev-C++ designer will remove them. Add custom headers after the block.
////Header Include Start
#include <wx/stattext.h>
#include <wx/statbox.h>
#include <wx/gauge.h>
#include <wx/button.h>
////Header Include End

////Dialog Style Start
#undef MBRDlg_STYLE
#define MBRDlg_STYLE wxCAPTION | wxSYSTEM_MENU | wxMINIMIZE_BOX | wxCLOSE_BOX
////Dialog Style End

class MBRDlg : public wxDialog
{
private:
DECLARE_EVENT_TABLE();

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);
[B][COLOR="Red"]void set();[/COLOR][/B]

.CPP

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

está declarado?

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...