1

I saw this video on Youtube. How to do a class in plain C code. https://youtu.be/v-8X53D8CN8?t=307

So I tried this.

struct{
    /* Skapa en variabel och getter-setter */
    int minVariabel;
    void (*setMinVariable)(minKlass*, int);
    int (*getMinVariable)(minKlass*);
};

And now I get an error beacuse minKlass is not declared.

Then I tried this.

typedef struct{
    /* Skapa en variabel och getter-setter */
    int minVariabel;
    void (*setMinVariable)(minKlass*, int);
    int (*getMinVariable)(minKlass*);
}minKlass;

Same here. The structure minKlass is still not declared. So how did he make this work in the video?

This is the solution for creating a class in C.

#include <stdio.h>

typedef struct minKlass minKlass;
struct minKlass{
    /* Skapa en variabel och getter-setter */
    int minVariabel;
    void (*setMinVariable)(minKlass*, int);
    int (*getMinVariable)(minKlass*);
};

minKlass* minKonstruktor(minKlass* this){

    /* Skapa getter-funktion */
    int getMinVariableFunktion(minKlass* this){
        return this->minVariabel;
    }

    /* Skapa setter-funktion */
    void setMinVariableFunktion(minKlass* this, int variabel){
        this->minVariabel = variabel;
    }

    /* Applicera dessa till pekarfunktionen i klassen */
    this->setMinVariable = setMinVariableFunktion;
    this->getMinVariable = getMinVariableFunktion;

    /* Retunera adressen av våran nya klass */
    return this;
}

int main(){
    /* Skapa två klasser */
    minKlass klass1;
    minKlass klass2;

    /* Passera klassen igenom konstruktören */
    minKlass* pKlass1 = minKonstruktor(&klass1);
    minKlass* pKlass2 = minKonstruktor(&klass2);

    /* Sätt ett värde till klassen */
    pKlass1->setMinVariable(pKlass1, 104);
    pKlass2->setMinVariable(pKlass2, 23);

    /* Ta ett värde från klassen */
    int minVariabel1 = pKlass1->minVariabel;
    int minVariabel2 = pKlass2->minVariabel;

    /* Skriv ut värdet */
    printf("minVariabel1 = %i, minVariabel2 = %i\n", minVariabel1, minVariabel2);

    return 0;
}
euraad
  • 2,467
  • 5
  • 30
  • 51

1 Answers1

2

You need to declare the symbol minKklass before you use it. There are two solutions to this:

  1. Either tag the structure and use the structure tag inside it:

    struct minKlass {
        /* Skapa en variabel och getter-setter */
        int minVariabel;
        void (*setMinVariable)(struct minKlass*, int);
        int (*getMinVariable)(struct minKlass*);
    };
    
  2. Or define the type-alias before the structure:

    // Forward declaration of the structure tag, together with
    // definition of the type-alias
    typedef struct minKlass minKlass;
    
    struct minKlass {
        /* Skapa en variabel och getter-setter */
        int minVariabel;
        void (*setMinVariable)(minKlass*, int);
        int (*getMinVariable)(minKlass*);
    };
    

By the way, it's okay to use the same name for both the structure tag and the type-alias. That's because structure tags live in a separate namespace from every other symbol in C.

Some programmer dude
  • 400,186
  • 35
  • 402
  • 621