C orientado a objeto?

Vocês se lembram daqueles tópicos sobre ponteiros para funções? Eles me inspiraram a fazer um pequeno teste. Vocês já devem ter ouvido falar que a principal diferença entre structs e classes é que a primeira não pode ter funções dentro de si e que a segunda pode. Acabei de descobrir que é possível burlar essa limitação e com uma pequena gambiarra deixar o C uma linguagem mais voltada a objetos.

Se você ainda não leu os artigos sobre ponteiros para funções, dê uma lida pelo menos no primeiro, apenas para saber do que se trata. Depois de feita a leitura, vamos para um passo-a-passo do que foi feito. Primeiro, a definição de uma nova struct:

typedef struct {
void (*function)();
int i;
} class;

Você pode confirmar que estamos usando C e não C++, já que se fosse usado o segundo, ele daria um erro devido o mau uso da palavra class. O que foi feito aqui é bem simples: definimos uma estrutura com um ponteiro para uma função e um inteiro. Agora o segundo passo:

void fnc( class *this )
{
this->i++;
printf( "Function called %d time(s).\n", this->i );
}

Agora definimos a função que será usada pela estrutura a cima. Infelizmente, não temos um jeito de ter acesso ao this que teríamos no C++. Isso pode ser contornado colocando como argumento um ponteiro. Essa parte ainda será objeto de estudos.

A terceira parte é a criação de um constructor. Já que não estamos trabalhando de fato com uma classe, o ponteiro para a função começa vazio; temos então que ajustar tudo manualmente e para facilitar criamos uma função com esse propósito:

class Class()
{
class a;

a.i = 0;
a.function = &function;
printf( "Constructor called.\n" );
return a;
}

Agora quando estivermos dentro do main, criamos uma nova instância dessa estrutura/classe usando esse construtor. O único problema é a falta de um
this
. Sem ele, não temos como acessar informações de dentro da struct sem passá
-la por referência, o que torna o esse método pouco prático. Talvez haja um jeito de
fazer o que eu quero usando macros.

O código todo:

#include <stdio.h>

typedef struct {
        void (*function)();
        int i;
} class;

void function( class *this )
{
        this->i++;
        printf( "Function called %d time(s).\n", this->i );
}

class Class()
{
        class a;

        a.i = 0;
        a.function = &function;
        printf( "Constructor called\n" );
        return a;
}

int main( int argc, char* argv[] )
{
        int count;

        class test = Class();

        for( count = 0; count < 10; count++ )
                test.function( &test );

        return 0;
}
Publicado em C. Tags: , . 2 Comentários »

LISP: Introdução à Função Format II

No artigo passado nós vimos o básico sobre a função format e as diretrizes de uso geral. Agora iremos nos aprofundar um pouco, vendo diretrizes mais específicas e seus parâmetros. Começaremos com a diretriz ~c.
Leia o resto deste post »

Publicado em Lisp. Tags: , . Deixar um comentário »