簡體   English   中英

如何在C中創建結構的“對象”

[英]How to create “objects” of struct in C

我正在用C語言編寫一個環形緩沖區庫,並試圖通過制作typedef結構的“對象”來擁有多個環形緩沖區。 這是我的.h庫中的結構:

//ringbuffer.h

// declare variables in struct
typedef struct Ringbuffer
{
    int* buff;           // ring buffer
    int  buffSize;       // ring buffer size
    // more vars here
}ringbuffer;

這就是我初始化緩沖區的方法,它的大小也可以釋放內存。

//ringbuffer.c

//initialize buffer
void ringbuffer_init(int buff_size, ringbuffer *a)                              
{
// allocate memory to buffer
    a->buff = malloc(buff_size * sizeof(int));  
}

// empty the buffer
void ringbuffer_empty(ringbuffer *a)
{
    free(a->buff);
}

為了與C ++並行,我想對其進行初始化,以便可以編寫與Ringbuffer buffer1;相等的東西Ringbuffer buffer1; 和C中的Ringbuffer buffer2 。現在我可以像這樣解決這個問題:

// example.c

#include "ringbuffer.h"
#define BUFFER_SIZE 10

int main(void)
{
    // create two ringbuffer instances by allocating memory
    ringbuffer* buff1 = malloc(sizeof(ringbuffer));
    ringbuffer* buff2 = malloc(sizeof(ringbuffer));

    // initialize the two buffers
    ringbuffer_init(BUFFER_SIZE, buff1);
    ringbuffer_init(BUFFER_SIZE, buff2);

    // use the buffers in some way here   

    free(buff1);
    free(buff2);
}

這意味着我的庫的用戶將不得不分配內存並釋放它。 這似乎不是一個好的實現。 我該如何以更精致的方式做到這一點?

完整的.h,.c和example.c文件可以在我的GitHub上找到

您可以采用面向對象的方法並創建一個構造函數,該構造函數初始化該結構並返回指向新分配的內存的指針。

例:

struct Ringbuffer *Ringbuffer_create()
{
    struct Ringbuffer *self = malloc(sizeof(struct Ringbuffer))
    /* Initiate the other struct members here too */
    ...
    return self;
}

在主文件中,您可以編寫以下內容:

struct ringbuffer *buff1 = Ringbuffer_create();

我還建議創建一個析構函數,以便您可以輕松銷毀“對象”。

void Ringbuffer_destroy(struct Ringbuffer **self)
{
    /* Free the allocated memory here */
}

您可以使用您已經提到的簡單方法:

#include "ringbuffer.h"
#define BUFFER_SIZE 10

int main(void)
{
    // create two ringbuffer instances by defining variables
    ringbuffer buff1;
    ringbuffer buff2;

    // initialize the two buffers
    ringbuffer_init(BUFFER_SIZE, &buff1);
    ringbuffer_init(BUFFER_SIZE, &buff2);

    // use the buffers in some way here   
}

您可以在struct中包含構造函數,請參見以下內容

#include<stdio.h>                                                               
#include<stdlib.h>                                                              

#define BUFFER_SIZE 10                                                          

typedef struct Ringbuffer                                                       
{                                                                               
    int* buff;           // ring buffer                                         
    int  buffSize;       // ring buffer size                                    
    Ringbuffer(int buffer_size) {                                               
        buff = (int *)malloc(buffer_size * sizeof(int));                        
    };                                                                          
    ~Ringbuffer() {                                                             
        if (buff)                                                               
            free(buff);                                                         
    };                                                                          
}ringbuffer;                                                                    

int main () {                                                                   


    ringbuffer buff1(BUFFER_SIZE);                                              
    ringbuffer buff2(BUFFER_SIZE);                                              

    return 0;                                                                   
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM