Orientação a Objetos em C…
Is That possible? .-.

Boa tarde galera lol

Bem, primeiramente gostaria de pedir desculpas ao pessoal, pois não temos conseguido arrumar tempo hábil para continuar com os dojos Dx e muito menos para os posts.
Estamos trabalhando muito agora no laboratório de robótica pois em poucas semanas começa a LARC/CBR lol

Mas vamos ao que interessa…
Vocês podem estar se perguntando, mas que loucura é essa meu?
Bom, a zueira começa quando queremos colocar orientação a objetos em uma linguagem que é altamente estruturada.

Mas como um amigo meu disse, linguagem de programação não é paradigma.

Agora chega de enrolação e vamos ao que interessa.

Vamos fazer um exemplo simples; vamos criar uma estrutura chamada Point, com dois atributos do tipo inteiro X e Y e uma função (metódo) que retorne esses valores e um construtor dessa estrutura onde passaremos os valores X e Y.

Primeiramente vamos declarar nossa estrutura.


typedef struct Point{
   int X;
   int Y;
} Point;

Uma estrutura normal correto? Então vamos começar a brincar 😀
Agora adicionaremos uma função (método) nela. O nosso método será chamado somar e irá retornar um valor inteiro.


typedef int (*Somar)(struct Point*);

typedef struct Point{
   int X;
   int Y;
   Somar soma;
} Point;

int somar(Point *this){
   return (this->X + this->Y);
}

 

Bem, o que fizemos?
Primeiro criarmos um tipo definido da nossa função e dizemos que esse tipo irá se chamar “Somar” e irá retornar um valor inteiro. Depois declaramos Somar dentro da nossa struct Point. E por último criamos a função (metódo) somar com a implementação da Soma.

Mas veja, temos que passar um ponteiro de Point na função. Pois em C não existe uma “ligação” direta entre a struct e a função. É tudo feito através de ponteiros. E também veja… Os parametros da nossa função também tem que ser iguais ao da definição.

Agora, que tal criarmos o nosso construtor?
Como citamos acima, tudo é ponteiros então… Vamos criar uma função que retorna nossa estrutura como um pointeiro 😀


  Point* Point_new(int x, int y){
	Point* point = malloc(sizeof(Point));
	point->X = x;
	point->Y = y;
	return point;
 }

O que fizemos? Simplesmente uma função que retorna um ponteiro da nossa estrutura Point.
Por convenção usamos o nome da estrutura e <Nome_Da_Estrutura>_new([params]) para o construtor.

No nosso caso, queremos dizer pro nosso construtor que ele será somente inicializado se forem passados os valores de X e Y. Colocamos isso nos parâmetros da nossa função, depois alocamos na memória o nosso construtor e além disso, passamos os valores de X e Y para a estrutura e por fim a retornamos.

Agora temos nossa estrutura com a forma basica de uma “classe” orientada a objetos.
Mas como vamos usá-la?
Simples…


int main(int argc, char const *argv[])
{
	Point* p = Point_new(10, 10);
	p->soma = somar;
	printf("Resultado soma: %d\n", p->soma(p));
	return 0;
}

Somente executar x)

Vou deixar disponivel aqui o código fonte que criamos aqui no nosso github x)

Se você curtiu esse post…
Não deixe de visitar nossa pagina no facebook e dê um joinha lá pra fortalecer x)

Abraços galera lol
Até a próxima

Leave a Reply

Your email address will not be published. Required fields are marked *