Classes C++ Tentando entender! [RESOLVIDO]

1. Classes C++ Tentando entender! [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 03/06/2020 - 08:21h

Demorei bastante para reduzir esse exemplo ao máximo e consegui deixar ele bem pequenino, pois ele veio de um exemplo bem complexo. Mas agora com os nomes que coloquei quero saber se entendi seu funcionamento!

Me corrijam se eu estiver falando besteira, pois estou escrevendo o que acho ter entendido! Neste exemplo!

Para que o efeito seja possível, ele criou um Novo Widget chamado MyBox a partir do Widget existente Fl_Box. Claro que neste caso Widget é uma Classe, eu entendi isso. Ou seja, falando de uma outra forma: Acredito que Ele pegou a Classe Fl_Box e criou uma Sub-Class dela e nessa Sub-Class de nome MyBox ele criou mais opções (Tipo mais coisas, mais funcionalidades). Essa opção que ele criou foi o INTEIRO handle.

Então ainda nessa Sub-Classe MyBox ele criou uma função para usar esse "handle".
Agora não sei se essa função tenha tipo uma outra nomenclatura, tipo: Membro ou Objeto dessa Sub-Classe...

A Minha dúvida é se o que eu expliquei acima é correto? Ou se tudo que entendi está completamente errado?

#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>

class MyBox: public Fl_Box {
int handle(int);
public:
MyBox(int x, int y, int w, int h, const char *l): Fl_Box(FL_BORDER_BOX,x,y,w,h,l) {
}
};

int MyBox::handle(int e) {
if(e == FL_ENTER) {
color(219);
redraw();
return 1;
} else if(e == FL_LEAVE) {
color(FL_GRAY);
redraw();
return 1;
} else
return 0;
}

int main() {
Fl_Window FrmMain(150, 100);
new MyBox(40,10,80,80, "Fl_Box");
FrmMain.end();
FrmMain.show();
return Fl::run();
}



  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 04/06/2020 - 23:45h

Nick-us escreveu:

Demorei bastante para reduzir esse exemplo ao máximo e consegui deixar ele bem pequenino, pois ele veio de um exemplo bem complexo. Mas agora com os nomes que coloquei quero saber se entendi seu funcionamento!

Me corrijam se eu estiver falando besteira, pois estou escrevendo o que acho ter entendido! Neste exemplo!

Para que o efeito seja possível, ele criou um Novo Widget chamado MyBox a partir do Widget existente Fl_Box. Claro que neste caso Widget é uma Classe, eu entendi isso. Ou seja, falando de uma outra forma: Acredito que Ele pegou a Classe Fl_Box e criou uma Sub-Class dela e nessa Sub-Class de nome MyBox ele criou mais opções (Tipo mais coisas, mais funcionalidades). Essa opção que ele criou foi o INTEIRO handle.


Não criou um inteiro. handle() é uma função-membro (ou método) da classe MyBox, que tem um parâmetro inteiro e retorna um valor inteiro.

Aliás, ele provavelmente não criou essa função. Ela provavelmente é uma função virtual na classe base Fl_Box, que ele reimplementou na classe derivada para poder ter um comportamento diferenciado (que parece ser o de trocar a cor quando o cursor do mouse passa sobre a caixa) do que seria o comportamento normal de uma Fl_Box comum.

Então ainda nessa Sub-Classe MyBox ele criou uma função para usar esse "handle".
Agora não sei se essa função tenha tipo uma outra nomenclatura, tipo: Membro ou Objeto dessa Sub-Classe...


Não. handle() é a própria função. Pelo visto, é a função dessa classe que processa diferentes tipos de mensagens (ou "eventos", a julgar pela escolha de e como nome do parâmetro e pelos nomes das constantes que ele testa como possíveis valores dessa variável) quando você interage com o objeto da GUI. Quem a invoca é provavelmente alguma outra função de Fl_Box ou de alguma outra classe da hierarquia do FLTK responsável pela cadeia de tratamento de mensagens passadas pelo ambiente gráfico ao programa.

(Todos os "provavelmente" e "pelo visto" são porque eu nunca usei FLTK, mas algumas das coisas mostradas são meio óbvias ou parecidas com o funcionamento de outras bibliotecas de GUI.)

A Minha dúvida é se o que eu expliquei acima é correto? Ou se tudo que entendi está completamente errado?


Lamento (mesmo!) dizer que está errado.

E razão pela qual eu lamento é que já lhe foi sugerido várias vezes dar uma parada para aprender o básico antes de partir para o que é mais complicado. Assim como eu o aconselhei a não tentar usar programação orientada a objetos (POO) numa linguagem que não tem suporte a POO (que é o caso do C), também lhe sugeri enfaticamente que investisse tempo em absorver de modo adequado os conceitos que vão lhe habilitar a programar sem ficar completamente perdido nem tentando adivinhar o que o código faz ou -- o que é pior ainda, e que foi exatamente o que você fez neste tópico -- qual o sentido de construções fundamentais da linguagem.

Por isso, eu repito mais uma vez a sugestão: pare o que está fazendo, pegue um bom livro introdutório, aprenda com segurança os elementos fundamentais, e, depois disso, volte a tentar construir seus edifícios em cima desses bons fundamentos que você então terá adquirido.

#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>

class MyBox: public Fl_Box {
int handle(int);


Esta aqui é a declaração da função membro handle, que especifica que ela recebe um argumento inteiro e devolve um valor inteiro.

Note como essa declaração se parece com um protótipo de função do C (na verdade, protótipos de função apareceram primeiro no C++, e depois foram importados para o C). Só que, neste caso, como o protótipo está dentro do escopo de definição da classe, isso faz com que a função seja um dos membros da classe.

public:
MyBox(int x, int y, int w, int h, const char *l): Fl_Box(FL_BORDER_BOX,x,y,w,h,l) {
}
};

int MyBox::handle(int e) {
if(e == FL_ENTER) {
color(219);
redraw();
return 1;
} else if(e == FL_LEAVE) {
color(FL_GRAY);
redraw();
return 1;
} else
return 0;
}


E acima está a definição da função-membro que fora declarada dentro da classe.

A definição poderia estar no mesmo espaço que a declaração, mas muitas vezes declaração e definição são feitas de maneira apartada por questões de organização de código. Por exemplo, num arquivo de cabeçalhos você costuma ter apenas declarações, e as implementações residem em bibliotecas ou em arquivos objetos.



int main() {
Fl_Window FrmMain(150, 100);
new MyBox(40,10,80,80, "Fl_Box");


E aqui você usa um objeto dessa classe.

Não sei se este código está certo, pois eu não estou vendo nada que vincule o objeto do tipo MyBox que criou a partir de alocação dinâmica (sem atribuir a nenhuma variável de tipo ponteiro) ao objeto do tipo formulário indicado por FrmMain.

Contudo, como eu não conheço o FLTK, pode ser que ela tenha alguma maneira de fazer essa associação automaticamente quando você tem apenas um formulário no seu programa. Supondo que esse seja o caso, então o código estaria certo, e a invocação da função MyBox::handle() do objeto que você alocou provavelmente se dará por algum mecanismo interno do formulário, que vai receber eventos vindos do mouse e vai reencaminhá-los para o objeto MyBox se tais eventos ocorrerem na área ocupada por ele dentro do formulário. Você não a invoca diretamente (nesse caso); quem a invoca é a função interna tratadora de eventos, de maneira análoga a uma função de callback, que normalmente é indicada por um ponteiro de função.

Você não vê isso porque a ideia toda da orientação a objetos da GUI é não forçá-lo a ver essas coisas. Como a função handle é uma função virtual, ela naturalmente já é um ponteiro dentro da implementação da classe. Além disso, o próprio objeto MyBox foi criado como um ponteiro, (possivelmente) subordinado ao formulário.


Agora, se você quiser realmente entender isso direito, precisa parar para estudar esses fundamentos.

   FrmMain.end();
FrmMain.show();
return Fl::run();
}




... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Classes C++ Tentando entender! [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 05/06/2020 - 16:37h

paulo1205 escreveu:
A Minha dúvida é se o que eu expliquei acima é correto? Ou se tudo que entendi está completamente errado?

Lamento (mesmo!) dizer que está errado.

E razão pela qual eu lamento é que já lhe foi sugerido várias vezes dar uma parada para aprender o básico antes de partir para o que é mais complicado. Assim como eu o aconselhei a não tentar usar programação orientada a objetos (POO) numa linguagem que não tem suporte a POO (que é o caso do C), também lhe sugeri enfaticamente que investisse tempo em absorver de modo adequado os conceitos que vão lhe habilitar a programar sem ficar completamente perdido nem tentando adivinhar o que o código faz ou -- o que é pior ainda, e que foi exatamente o que você fez neste tópico -- qual o sentido de construções fundamentais da linguagem.

Por isso, eu repito mais uma vez a sugestão: pare o que está fazendo, pegue um bom livro introdutório, aprenda com segurança os elementos fundamentais, e, depois disso, volte a tentar construir seus edifícios em cima desses bons fundamentos que você então terá adquirido.

Paulo mais uma vez obrigado! Mas estou fazendo o que vc sugeriu sim! É que demoro um pouco para entender as coisas!
Eu li sobre Classes, e preciso criar a minha própria Classe para entender ela separadamente! Não me pareceu difícil.
Os Livros que vc indicou já consegui alguns, eu tenho lido e marcado.

Eu consegui Programming Principles and Practice Using C++ (Em Inglês Somente) Indicado por você, e gostei muito, pois ele usa FLTK e isso me empolgou muito, uma Biblioiteca indicada pelo criador do C++
Mas calma ai, estou lendo ainda... Estou no comecinho! Eu costumo ler, anotar o que entendi separadamente para consulta posterior, criar exemplos do que entendi para ter certeza que entendi.

Acontece que nesse processo não uso apenas o Livro, pois qdo não entendo procuro outras fontes sobre o mesmo assunto, para comparar, tipo outra explicação do mesmo assunto.

Sua indicação desse livro em questão me ajudou muito a usar esse Autor como referência, visto que muitos livros por ai tem exemplos meio que errados!

Outros livros que estou lendo ao mesmo tempo com esse são:
C++ BR (Silvio do Lago Pereira)
C++ BR em Ambiente Multiplataforma
C++ For Beginners
The C++ Programming Language 4th

Eu dou preferência aos que estão em português pq fica um pouco mais fácil, porém compreendo que não são tão bons e não são fontes confiáveis de referência, mas nesse caso comparo eles com os do Bjarne Stroustrup

Porém claro, eu meio que misturo um pouco as coisas, pq ao mesmo tempo que leio linha a linha do Livro, estou criando uma Janela em FLTK para meu programa, Tentando criar um Grid para receber dados de um arquivo em C++. E ainda não dominei direito Entrada/Saida em C++.

Mas tipo, em C eu sei mecher com arquivos, agora quero saber fazer o mesmo em C++. Eu entendi o básico e sei o que tenho que fazer, acontece que esse básico ainda de Entrada/Saida ainda não absorvi completamente, mesmo lendo pelo menos uns 8 locais diferentes sobre isso, ainda não posso montar um exemplo eficiente sabendo o que significa 100% cada linha! Mas ainda não cheguei nessa parte no Livro do Bjarne Stroustrup estou confiante que no Livro dele, mesmo em Inglês me leve a compreender 100%.

No meio do caminho me deparei com Class, por causa do Grid em questão! Visto que a 1ª Coisa em um Programa é o Planejamento da parte Visual.
Então a sequencia que estou usando é:

1) (FEITO) Planejar o que quero do meu programa e como ele vai funcionar. Está todo descrito e Salvo em Texto. Esse planejamento fiz com Base do que sou capaz de fazer em C, logo faltando apenas aprender C++ para que seja feito em C++.

2) (FEITO) Escolher a Biblioteca Gráfica. Escolhi FLTK por ela ser extremamente pequena, super simples, pouquissima coisa pra estudar, Extremamente poderosa, e indicada pelo Bjarne Stroustrup. (Adorei isso)

3) Criar as Janelas. Isso ainda estou fazendo, sei criar tudo, faltando apenas o Grid, que não é arrastar e soltar como em outras bibliotecas, pois o Draw dele precisa ser feito na mão kkkkkkkk Mas não vejo como um problema, e sim como um desafio! Eu já consegui criar um Azul Lindo. Mas falta eu entender perfeitamente o que fiz! Pois peguei um exemplo gigantesco, reduzi ele ao máximo, e agora estou modificando para entender ele, conhecer cada linha e seu significado, para que eu tenha o poder de mudar o que eu desejar!

No Caso do Grid, foi quando eu me deparei com Classes, Membros e Etc... que embora pareça que eu tenha entendido, ainda falta muito, pois só terei mesmo entendido quando eu conseguir mesmo criar uma Classe e colocar ela em funcionamento. Vi exemplos que criam classes básicas como um Retangulo, o cálculo de alguma coisa, O que eu pensei mesmo foi em criar uma Classe com nome FICHA e ela teria Tipo, Nome, Tel, End. Então eu usaria essa Classe. com algum propósito, porém, ainda estou tentando entender, e nem estou perto disso no Livro do Bjarne Stroustrup. E no que li pela Internet, me pareceu não tão complicado! Mas ainda estou estudando isso!

4) Por último escrever o código em C++, mas essa parte é a mais fácil, já que já fiz esse programa usando a Biblioteca wxWidgets. A diferença aqui é que reforçarei meu aprendizado em C++ dando preferência a escrever tudo em C++ ao invés de usar o pronto da Biblioteca, apenas para aprendizado! Pq já li você informar que o ideal é usar o que a Biblioteca oferece para evitar conversões. Mas inicialmente meu objetivo é usar meu exemplo para aprender C++ depois sim, crio novamente o mesmo programa usando a Biblioteca qdo for usar o programa em si.

Embora eu desconfie claro que com FLTK nem precisarei me preocupar com isso, visto que FLTK usa C++ diretamente, ele não parece criar nada que precise ser convertido como é com QT ou wxWidgets.

OBS:
Eu entendo que talvez a forma como eu estudo podem achar que não seja a ideal, mas para mim, parece a forma mais fácil pra eu conseguir entender!
Quando eu estava estudando C inicialmente, eu li 1 Livro inteiro e não entendi praticamente nada! Não sou bom em Teoria!
Então precisei ler tudo de novo, precisei comparar com outros livros que li, a mesma coisa, e só mesmo consegui entender quando criei exemplos funcionais.
Porém mesmo assim, sei que não aprendi quase nada!

Pra vc ter uma idéia: Eu sei que main é uma função, sei o que faz uma função normal que não seja o main. Compreendi sobre retorno da função, parâmetros (Um Pouco).
Mas mesmo estudando o Main e entendendo alguma coisa, de verdade eu não sei como o main funciona ainda!
Se eu ficasse o tempo inteiro buscando informações para entender o main talvez eu leve o ano inteiro! E pra ser sincero nunca nem achei nada que explique de verdade o que é o main, ou pelo menos não entendi até hoje. Motivo pelo qual sou incapaz de criar um programa em C sem a função main tradicional.

Exemplo: O Dia que eu conseguir fazer isso abaixo funcionar, com certeza eu saberei o que é main
int MeuMain(void) {
return 0;
}

Porque dei uma pausa sobre o Main? Porque notei que para entender ele mais, eu terei que estudar o que é um Interpretador, o que é um Compilador, possivelmente eu teria que criar meu próprio compilador para isso. Vou precisar estudar o funcionamento de outros compiladores, visto que o único que sei usar é o GCC e nem sei quase nada do GCC.

Não parei meus estudos em C. A maior pendência e a que considero mais importante que eu ainda não fiz, foi descobrir ONDE baixar o C.
Visto que nem o C eu tenho de verdade, o que tenho é um Compilador que possue o C.
E não é o que quero. Eu quero o C Puro, ou seja uma pasta com todas as suas bibliotecas originais!
Então sim, usando um compilador qualquer que não seja o GCC, de preferência o primeiro compilador C criado, eu consiga compilar um Hello World, como faziam antigamente!

Se vc souber por acaso como eu consigo o C Original livre de terceiros, ajudaria!

Voltando ao assunto. Eu costumo fazer assim para aprender:
Eu escolho algo que quero criar, então sigo aquela linha de aprendizado! Vendo os resultados, eu me sinto empolgado!

Igual aprender a dirigir. Eu me sinto melhor, comprando o Carro, entrando nele, olhando ele, vendo o que ele faz, então aprendo o básico para usar ele, uso esse básico e vou me aprofundando até aprender mecanica!

Não consigo aprender mecanica e a engenharia do Carro primeiro, sem ve-lo ou usá-lo, acho que a falta de animação ou empolgação atrapalha!

Eu estudei variáveis em C, mas só estudei o que eu vou usar, no caso INT e CHAR. Não tenho uso para float, double e outras variações delas, por isso nunca me interessei, e eu gastaria um enorme tempo estudando elas sendo que acredito que nunca as usarei! O dia que eu precisar de um Float, então estudo!

Ainda em C, estudei somente comandos (Funções) que uso, e claro, ainda estou querendo saber ao menos o nome de todas as funções existentes em C e o que elas fazem, pois não cataloguei isso ainda! farei isso em C e C++, Em C é mais fácil, tem menos coisas!
Outra coisa que ainda não fiz em C mas quero fazer, é criar minhas funções, substituindo algumas existentes, ainda não fiz isso, porque ainda não consegui entender como encontrar essas funções corretamente nas bibliotecas para separa-las.

Achei super complexo encontrar 1 função! Elas ainda tem um nível de complexidade muito alto pra mim, para que eu possa modificá-las em seu próprio código. Além de ainda faltar aprender muita coisa em C que estão pendentes, pois ainda sei somente o básico pra criar pequenas coisas!

C é um Mundo ainda Gigante, misturei ao estudo de C++ pq na prática preciso usar as janelas, para criar meu Catalogo de Informações sobre o que aprendo!
Minha idéia sobre o C++ é apenas eu estar um pouco apto pra ler um arquivo para um Grid, editar, excluir, salvar e pesquisar. Somente isso, para voltar para o C e anotar melhor o que aprendo!

Não estou preso a um resultado, tipo, eu fiz o programa de Contatos com Fotos e tudo, em C++ usando wxWidgets, e agora estou fazendo ele de novo usando FLTK e adorei ela!
E talvez eu faça ele de novo e de novo usando QT, GTK... apenas para comparar as biliotecas, entender como funcionam, e ainda realmente quero e pensei em usar apenas as APIs do X11, porém, antes eu preciso saber mais de classes, c++ para isso.

Estudar wxWidgets me deu um bom aprendizado sobre Widgets, como funcionam, como converter algumas coisas, a FLTK está extendendo esse aprendizado, visto que ela é mais baixo nível.

É isso, para não alongar tanto o texto



4. Re: Classes C++ Tentando entender!

Nick Us
Nick-us

(usa Slackware)

Enviado em 05/06/2020 - 17:01h

paulo1205 escreveu:
Contudo, como eu não conheço o FLTK

Paulo, a opinião que tenho no momento de sua pessoa, se eu não estiver errado, é que vc é um AMANTE da programação, suas respostas são detalhadas, explicadas, e para isso funcionar é porque vc gosta muito disso!

Por isso acredito mesmo que valha muito a pena vc dar uma olhadinha na FLTK https://www.fltk.org/
Eu instalei a atual do Github: https://github.com/fltk/fltk

Ela é tão linda que possue apenas 151 arquivos! E com isso Super Poderosa, AMEI isso!
Os programas criados com ela são de 18k, 20k, extremamente pequenos comparados a outras bibliotecas!

Ela vem com o Programa FLUID para Designer, pequeno, super simples, e extremamente objetivo! Eu o uso apenas para marcar a posição dos objetos! Prefiro assim! Mas dá pra usar somente ele para programar!

Por ela ser simples, vc pode inventar qualquer coisa nela! Criar seus Widgets com muita facilidade!

E ela é a única que consta no Livro de Bjarne Stroustrup.

Eu realmente acredito mesmo que vc vai adorar conhecer, usar, criar, talvez até invente de criar com ela seu próprio FLUID o que eu mesmo cheguei a pensar! UAU criar meu próprio GUI Designer!!! E com ela isso pareceu ser extremamente simples e fácil!

Lembre-se apenas, que alguns de seus Widgets são de baixo nível, mas isso que eu AMEI, no caso, não existe GRID, e sim um Fl_Table que com ele, vc cria seu Grid do jeito que quiser!

Ignore a Aparência Inicial, pq é realmente besteira! Crie um Hello World no FLUID e sinta o Poder do FLUID. Pois dá pra fazer muita coisa nele, embora eu só use mesmo para marcar X, Y dos Widgets.

Como eu disse em um Post anterior, essa Janela em anexo neste post, eu Criei com FLTK ou seja, nós é que definimos como fica nosso programa! E o que é ainda mais legal, nela é possível vc criar tudo, o seu próprio tipo de botão ou texto e etc... parece bem fácil fazer isso!

Essa é minha indicação! Não sei se é boa, visto que sou aprendiz. :)



5. Re: Classes C++ Tentando entender!

Nick Us
Nick-us

(usa Slackware)

Enviado em 05/06/2020 - 17:10h

paulo1205 escreveu:
Não sei se este código está certo, pois eu não estou vendo nada que vincule o objeto do tipo MyBox que criou a partir de alocação dinâmica (sem atribuir a nenhuma variável de tipo ponteiro) ao objeto do tipo formulário indicado por FrmMain.

A FLTK é interessante, essas são as formas como descobri que posso criar um Objeto ou uma Janela
   // Forma mais simples, gosto dela!
#include <FL/Fl_Window.H>
int main(void) {
Fl_Window FrmMain(300, 200); // Não uso Ponteiro
FrmMain.show(); // Repare que pra exibir a Janela neste caso uso o PONTO
return Fl::run();
}
   // Example Original FLTK
#include <FL/Fl_Window.H>
int main(void) {
Fl_Window *FrmMain = new Fl_Window(300, 200); // Tradicional usando Ponteiro
FrmMain->show(); // Neste caso uso -> Para referências de Ponteiros (Isso que inicialmente entendi kkkk)
return Fl::run();
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts