gpt4 book ai didi

C 结构函数指针传递自引用作为参数

转载 作者:行者123 更新时间:2023-12-01 23:58:41 25 4
gpt4 key购买 nike

我想运行具有自动填充功能的结构指向的函数。

这是我正在处理的部分:

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

struct Fra { //Fraction
int n; //Numerator
int d; //Denominator
void (*p)(struct Fra*);
void (*sD)(int, struct Fra*);
void (*sN)(int, struct Fra*);
};

void print(struct Fra*);
void setDenom(int, struct Fra*);
void setNum(int, struct Fra*);

int main() {

struct Fra* fraA = 0;

fraA = (struct Fra*) malloc(sizeof(struct Fra));

fraA->sN = setNum;
fraA->sN(2, fraA);
fraA->sD = setDenom;
fraA->sD(3, fraA);
fraA->p = print;
fraA->p(fraA);

return 0;
}

这就是我一直在努力实现的目标

从:
fraA->sN(2, fraA);
fraA->sD(3, fraA);
fraA->p(fraA);

到:
fraA->sN(2);
fraA->sD(3);
fraA->p();

在花了一些时间进行试错之后,我得出的结论是我需要这方面的帮助。我试过浏览,但似乎我没有正确的关键字,所以我无法验证这个问题是否是双重的。

谢谢你的帮助。

最佳答案

你可以声明一些宏来保存总是传递正确的引用,这就是你所能做的:

#define FRA_NEW(this, sN sD, sP) \
{ \
(this) = calloc(sizeof(*(this))) \
if (this) \
{ \
(this)->sN = (sN); \
(this)->sN = (sD); \
(this)->sN = (sP); \
} \
}

#define FR_DELETE(this) \
free(this)

#define FRA_PRINT(this) \
(this)->print(this)

#define FRA_SETNUM(this, num) \
(this)->setNum(this, num)

#define FRA_SETDENOM(this, denom) \
(this)->setDenom(this, denom)

此外,我建议始终将“this”作为“成员”功能的第一个参数。
int main(void) 
{
struct Fra * fraA = NULL;

FRA_NEW(fraA, setNum, setDenom, print);
if (NULL == fraA)
{
perror("FRA_NEW() failed");
return 1;
}

FRA_SETNUM(fraA, 2);
FRA_SETDENOM(fraA, 3);
FRA_PRINT(fraA);

FRA_DELETE(fraA);

return 0;
}

关于C 结构函数指针传递自引用作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22475550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com