TransWikia.com

Micro sistema de classes em C

Stack Overflow em Português Asked by Daniel Carvalho on November 5, 2021

O que gostaria é inicializar automaticamente uma struct que recebe ponteiros de funções. Por exemplo:

struct teste{
    int x;
    int y;
    int (*soma)(int, int);
};

typedef struct teste Teste;

int soma(int a, int b){
    return a + b;
}

Teste *t1;
t1->soma = soma;

printf("---> 2 + 2 = %d n", t1->soma(2, 2)); // ---> 2 + 2 = 4

Isso compila e executa muito bem. Porém, gostaria de não precisar fazer o:

Teste *t1;
t1->soma = soma;

E simplesmente fazer algo como:

Teste *t1;
*t1 = newTeste();

Ou até mesmo:

Teste *t1 = newTeste();

Sendo que a função newTeste() seria algo como:

Teste newTeste(){
    Teste *t;
    t->soma = soma;
    return *t;
}

Isso compila mas não roda.

Sei que estou me perdendo nos ponteiros, mas não consigo enxergar exatamente onde. Também não sei se o que quero fazer é algo viável, apenas me surgiu esta ideia de micro simular uma classe e gostaria de colocar em prática.

3 Answers

Muito obrigado pela ajuda. Acabei misturando um pouco das ideias apresentadas e cheguei ao seguinte código que atende ao que queria até o momento:

Declaração da "micro classe":

typedef struct teste{
    int x;
    int y;
    int (*soma)(int, int);
    int (*subtrai)(int, int);
    int (*divide)(int, int);
} Teste;

Teste newTeste(){
    int soma(int a, int b){
        return a + b;
    }

    int subtrai(int a, int b){
        return a - b;
    }

    int divide(int a, int b){
        return a / b;
    }

    Teste t;
    t.soma = soma;
    t.subtrai = subtrai;
    t.divide = divide;
    return t;
};

Utilização:

Teste t1 = newTeste();
t1.x = 12;
t1.y = 7;

Teste t2 = newTeste();
t2.x = 5;
t2.y = 5;

Teste t3 = newTeste();
t3.x = 4;
t3.y = 4;

// ---> 12 + 7 = 19
printf("---> %d + %d = %d n", t1.x, t1.y, t1.soma(t1.x,t1.y)); 
// ---> 5 - 5 = 19
printf("---> %d - %d = %d n", t2.x, t2.y, t2.subtrai(t2.x,t2.y)); 
// ---> 4 / 4 = 4
printf("---> %d / %d = %d n", t3.x, t3.y, t3.divide(t3.x,t3.y)); 

Como sugerido, criei um escopo para a declaração dos "métodos" Agora vou em busca de um "this".

Muito obrigado.

Answered by Daniel Carvalho on November 5, 2021

Teste newTeste(){
    Teste *t;
    t->soma = soma;
    return t;
}

Tente assim, sem o * no return.

Answered by dfop02 on November 5, 2021

Se está retornando um ponteiro o tipo da função deve ser um ponteiro, só falta isto.

Teste *newTeste() {
    Teste *t;
    t->soma = soma;
    return *t;
}

Coloquei no GitHub para referência futura.

Existe um outro problema, essa variável soma parece mágica, provavelmente deve ser global, não deveria fazer isto, especialmente quando quer simular uma classe.

Existem outros erros conceituais nessa construção.

Answered by Maniero on November 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP