В C, как член данных структуры используется как часть функции, на которую указывает член той же структуры? - PullRequest
0 голосов
/ 04 октября 2018

У меня есть две объявленные вперед функции и структура:

int _bar(void*);
int _bar2(int);

typedef struct foo {
  void* array[128];
  int (*bar)(void* x) = _bar;
  int (*bar2)(int x) = _bar2;
} FOO;

Как получить доступ к array из bar и bar2 в произвольном экземпляре FOO, например, array изменчиво в каждой функции? Можно ли это сделать?

И да, я знаю, что проще и, пожалуй, лучше просто использовать что-то отличное от C, чтобы делать подобные вещи.Это просто не главное, поэтому пожалуйста, ответьте на вопрос в ответ на вопрос , без попытки «диагностировать» какую-то более глубокую проблему, как это делают многие ответы.

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Вы можете сделать что-то вроде этого:

#include <stdio.h>

typedef struct foo {
  int array[128];
  int(*bar)(struct foo* this, void* x);
  int(*bar2)(struct foo* this, int x);
} FOO;


int _bar(FOO *this, void *p)
{
  printf("bar2(%p)\n", p);
  return 0;
}

int _bar2(FOO *this, int i)
{
  printf("array[4] = %d\n", this->array[4]);
  printf("bar2(%d)\n", i);
  return i*2;
}

void ConstructFoo(struct foo *f)
{
  for (int i = 0; i < sizeof(f->array) / sizeof(f->array[0]); i++)
    f->array[i] = i;

  f->bar = _bar;
  f->bar2 = _bar2;
}

int main()
{
  struct foo f;
  ConstructFoo(&f);

  printf ("%d\n", f.bar2(&f, 42));
}

Я изменил тип array только для упрощения примера.

Этот пример может быть улучшен в зависимости от того, что вына самом деле нужно, например, вы можете добавить функцию, которая устанавливает функции bar и bar2 "member" на что-то другое, чем _bar и _bar2.

0 голосов
/ 04 октября 2018

Вы пытаетесь сделать ООП в C.Вы хотите, чтобы bar и foo походили на функцию-член C ++.Вы не можете сделать это в C, и вы даже не должны пытаться.Не боритесь с языком.

Просто добавьте параметр Foo к бесплатным функциям:

typedef struct foo {
  void* array[128];
} Foo;

int bar(/*const*/ Foo* foo, void*);
int bar2(/*const*/ Foo* foo, int);
...