C语言 从结构中的函数指针访问数据成员

92dk7w1h  于 2023-06-05  发布在  其他
关注(0)|答案(2)|浏览(187)

我得承认我缺乏C语言的经验,因此我不确定如何为结构实现函数。有很多答案:Define functions in structsCan I define a function inside a C structure?C - function inside struct,但它们没有回答我正在寻找的结果。现在我想要的是以下内容:
假设我有一个这样的struct:

typedef struct Ball {
  float x, y;
  float speedX, speedY;
  float radius;
  void (*Draw)();
} Ball;

现在我希望Draw函数能够访问Ball变量的成员,就像我有一个C++中的结构体示例一样。该函数应该能够访问变量,并修改他们,因为我想它。这可能吗
我试过一些像这样的荒谬的东西,但没有任何结果。

typedef struct Ball {
  float x, y;
  float speedX, speedY;
  float radius;
  void (*Draw)();
} Ball;

void Draw(float *x, float *y, float *speedX, float *speedY, float *radius) {
  DrawCircle((int)*x, (int)*y, (int)*radius, WHITE);
}

这里的C++ equivilant:

struct Ball {
        float x{}, y{};
        float speedX{}, speedY{};
        float radius{};
        void Draw() {
            DrawCircle((int)x, (int)y, (int)radius, WHITE); //I know I could static_cast, but who cares :)
        }
    };
int main(int argc, char ** argv) {
    Ball ball;
    ball.x = 100.f;
   ...
    ball.Draw();
}

正如你所看到的,C++的方式非常简单,我只是不能用C来理解它。

slhcrj9b

slhcrj9b1#

只需按以下方式声明指向函数的指针

typedef struct Ball {
  float x, y;
  float speedX, speedY;
  float radius;
  void (*Draw)( struct Ball * );
} Ball;

当函数被调用时,向它传递一个指向结构类型的对象的指针。
比如说,

Ball ball = { /* initializers of data members of the structure */ };

ball.Draw( &ball );

该函数可以例如像

void Draw( struct Ball *ball ) 
{
    DrawCircle( ball->x, ball->y, ball->radius, WHITE );
}

并且结构类型的对象的数据成员Draw可以被分配为

ball.Draw = Draw;

或者你也可以像这样声明函数DrawCircle

void DrawCircle( struct Ball *ball );

假设它仅用于struct Ball类型的对象。
并直接用这个函数初始化数据成员Draw

ball.Draw = DrawCircle;
inb24sb2

inb24sb22#

如果所有的Ball结构共享同一个Draw函数,那么就不需要在结构中存储指向该函数的函数指针。这是一种毫无意义的内存浪费,并不必要地使事情复杂化。
只需将每个Ball唯一的信息存储在结构中:

typedef struct Ball {
  float x, y;
  float speedX, speedY;
  float radius;
  // void (*Draw)(); No need for this!
} Ball;

然后做一个画球的函数:

void draw_a_ball(Ball *ball) {
  DrawCircle((int)Ball->x, (int)Ball->y, (int)Ball->radius, WHITE);
}

然后你可以有:

int main(int argc, char ** argv) {
    Ball ball;
    ball.x = 100.f;
    ...
    draw_a_ball(&ball);
}

相关问题