我正在用C语言编写一个环形缓冲库,并且我试图通过创建一个类型定义函数结构的“对象”来实现多个环形缓冲区。这是我的.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++类似,我想初始化它,这样我就可以用C编写等同于Ringbuffer buffer1;和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);
}这意味着我的库的用户必须分配内存并释放它。这看起来不像是一个好的实现。我如何才能以一种更微妙的方式做到这一点呢?
在我的GitHub上可以找到完整的.h、.c和example.c文件。
发布于 2019-08-13 14:20:33
您可以采用面向对象的方法,创建一个初始化结构并返回指向新分配内存的指针的构造函数。
示例:
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 */
}发布于 2019-08-13 15:32:09
你可以使用你已经提到的简单的方法:
#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
}发布于 2019-08-13 16:00:06
您可以在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;
} https://stackoverflow.com/questions/57471924
复制相似问题