2014-08-31 2 views
0

Я изучаю понятия указателей функций в C и задавался вопросом, как использовать в структурах.Использование указателя функции в C

Скажем, например, у меня есть:

struct math{ 
    int a; 
    int b; 
    int (*ADD)(int, int); 
    int (*subtract)(int, int); 

}; 

int add(int a ,int b) 
{ 
return (a+b); 
} 

int main() 
{ 
    math M1; 
    M1.a = 1; 
    M2.b = 2; 
    M2.ADD = add; 
} 

В этом функция указатель ADD указывает функционировать надстройку. Есть ли способ написать функцию, похожую на конструктор, которая будет автоматически указывать ADD для добавления?

так, что если написать M1.construct()

он должен сделать в этом

void construct() 
{ 
    ADD = add; 
} 

Я не хочу, чтобы писать для каждого объектов одни и те же линии. Есть ли способ для этого?

+0

Там нет никакого способа, чтобы добавить C++ - функции-членов стиля 'struct' типов в C. – dreamlax

+1

в ответе на ваш вопрос о автоматически указывая ADD добавить, ответ да , Хотя вы можете сохранить его до тех пор, пока вам не станет удобно пользоваться указателями, распределением памяти и т. Д. Подробности можно найти в [** Объектно-ориентированное программирование с использованием ANSI-C **] (https://ritdml.rit.edu/ручка/1850/8544). Конструкция типа класса из структур делает довольно интересное чтение. –

ответ

2

Лучшее, что вы можете сделать, это предоставить такую ​​функцию:

void math_construct(struct math *m, int a, int b) 
{ 
    m->a = a; 
    m->b = b; 
    m->ADD = add; 
} 


int main() 
{ 
    struct math m1; 
    math_construct(&m1, 44, 55); 
} 

Или, в качестве альтернативы, вы можете предоставить функцию выделения памяти для struct math, а также, но это потребует от вас использовать free(), когда вам больше не нужно:

struct math *math_new(int a, int b) 
{ 
    struct math *result = malloc(sizeof *result); 
    // check whether result is NULL before continuing 
    result->a = a; 
    result->b = b; 
    result->ADD = add; 
    return result; 
} 

int main() 
{ 
    struct math *m1 = math_new(44, 55); 
    // do something with m1 
    free(m1); 
} 
+0

Спасибо! Это было бы для меня :) – user1692342