首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中创建结构的“对象”

如何在C中创建结构的“对象”
EN

Stack Overflow用户
提问于 2019-08-13 14:02:24
回答 4查看 242关注 0票数 1

我正在用C语言编写一个环形缓冲库,并且我试图通过创建一个类型定义函数结构的“对象”来实现多个环形缓冲区。这是我的.h库中的结构:

代码语言:javascript
复制
//ringbuffer.h

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

这就是我初始化缓冲区和它的大小以及释放内存的方式。

代码语言:javascript
复制
//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的东西。现在,我像这样解决这个问题:

代码语言:javascript
复制
// 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文件。

EN

回答 4

Stack Overflow用户

发布于 2019-08-13 14:20:33

您可以采用面向对象的方法,创建一个初始化结构并返回指向新分配内存的指针的构造函数。

示例:

代码语言:javascript
复制
struct Ringbuffer *Ringbuffer_create()
{
    struct Ringbuffer *self = malloc(sizeof(struct Ringbuffer))
    /* Initiate the other struct members here too */
    ...
    return self;
}

在主文件中,您可以编写以下内容:

代码语言:javascript
复制
struct ringbuffer *buff1 = Ringbuffer_create();

我还建议创建一个析构函数,这样你就可以很容易地销毁“对象”。

代码语言:javascript
复制
void Ringbuffer_destroy(struct Ringbuffer **self)
{
    /* Free the allocated memory here */
}
票数 2
EN

Stack Overflow用户

发布于 2019-08-13 15:32:09

你可以使用你已经提到的简单的方法:

代码语言:javascript
复制
#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   
}
票数 2
EN

Stack Overflow用户

发布于 2019-08-13 16:00:06

您可以在struct中使用构造函数,请参见以下内容

代码语言:javascript
复制
#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;                                                                   
} 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57471924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档