[英]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;
}
您可能需要閱讀以下內容: http : //www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.4
還相關: 編譯的C ++類是什么樣的?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.