2014-12-11 1 views
1

나는 내가 그렇게 같은 방법을 모방 C에서 함수 포인터를 사용할 수 있습니다 알고함수 포인터는 C에서 유해한 메소드를 시뮬레이트합니까?

typedef struct a 
{ 
    int x, y; 
    int (*add)(int x, int y); 
}a; 

int add(int x, int y) 
{ 
    return x + y; 
} 

int main() 
{ 
    a b = {2, 3, &add}; 
    printf("%d\n", b.add(b.x, b.y)); 
    return 0; 
} 

그러나 C에서이 나쁜 형태입니까? 이 작업을 수행하는 다른 방법을 찾아야합니까? 이것이 나쁘다면, 내가 대신이 일을해야합니까? 분명히 그것을 사용할 때이 예제에서와 같이 하찮은 함수가 될 수는 없습니다.

+2

접근이 종류 :

typedef struct a { int x, y; int (*add)(struct a* this, int x, int y); } a; 

과 :

따라서 코드처럼되어야한다. –

+1

함수 포인터가 필요한 좋은 이유가 있는지 여부에 따라 다릅니다. Java 또는 C++에 익숙해 져서이 작업을 수행하는 경우 실제로는 좋은 이유가 아닙니다. 왜 당신은 "방법"이 필요하다고 생각합니까? – JS1

+0

내 의견 : 그것은 런타임에 포인터를 변경하거나 여러 추가 유형 (조잡한 다형성)을 나타 내기 위해이 구조체를 사용하는 경우에 더 유용합니다. 포인터에 할당 된 '& add' 만 있으면이 작업을 더 간단하게 할 수 있습니다. –

답변

-1

이것은 gcc 4.4.7에서 잘 작동하고, 리눅스 커널 소스 코드에서는 이런 식으로 작성된 많은 상황이 있습니다. file_operations, inode_operations 등과 같이 전략 패턴 및 일부 객체 지향 프로그래밍 생각과 결합됩니다. 그래서, 나는 그것이 C 나쁜 양식을하지 않습니다 생각, 내가 생각하는 유일한 결함이처럼 쓸 수 있다는 것입니다 :

a b = {.x=2, .y=3, .add=add}; 

이 더 읽기와 C 스타일입니다.

+3

그것은 [** 지정된 이니셜 라이저 **] (https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html)라고 불리며, OP가 이미하고있는 것을 정확히 수행합니다. ** 나는 그것을해야합니까? ** 어떤 식 으로든 질문에 대답하지 않습니다. 이런 식으로 게시물을 올리려면 ** 댓글을 달아주세요 ** –

2

나쁘지 않습니다. C; 리눅스는이 스타일 때문에 개인의 취향에 대한 답을 떠나, 당신에게 금품을 구입하는 경우가 명확하지 않다

는, 미학 등 내가 좋아하는 것

그러나 한 가지 언급 이러한 코드로 가득하다 : 당신이 경우 정말로 메소드를 에뮬레이트하고 싶다면 'this'포인터를 에뮬레이트해야합니다. 그것이 일반적으로 어떤 방법 (또는 캡슐화)이 무엇인지에 대한 것입니다. 그들은 구조의 내부에 접근 할 수 있습니다. 실제 C 코드에서 매우 자주 사용되는

printf("%d\n", b.add(&b, b.x, b.y));