2017-09-07 5 views
0

를 함수 포인터를 사용하는 구조 파라미터를 적용초기화하고 다음 코드 구조 부재로서

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

typedef struct{ 
    int a; 
    int b; 
    int (*func1)(); 
    int (*func2)(); 
}STR_X2; 
void init(STR_X2 self , int _a , int _b){ 
    self.a = _a; 
    self.b = _b; 
    printf("Init a:%d, b:%d \n",self.a,self.b); 
} 
int multiply(STR_X2 self){ 
    printf("Multiply a:%d, b:%d, res:%d\n",self.a,self.b,self.a*self.b); 
    return self.a*self.b; 
} 

int main(void) { 
    static STR_X2 val2; 
    val2.func1 = init; 
    val2.func2 = multiply; 

    printf("set values of a and b using init() function\n"); 
    val2.func1(val2,3,5); 
    printf("result:%d\n",val2.func2(val2)); 

    printf("\nset values of a and b directly\n"); 
    val2.a=3; 
    val2.b = 5; 
    printf("result:%d\n",val2.func2(val2)); 
    return EXIT_SUCCESS; 
} 

함수 포인터로서 두 멤버가 STR_X2 구조.

  • func1는 파라미터 abinit() 및 SES 값으로 설정된다.
  • func2multiply()로 설정하고 코드를 실행하여 ab

을 곱되고, 나는 다음과 같은 결과가 : func1()이 작동하지 않습니다 사용하여 매개 변수를 초기화하는 것을 의미

set values of a and b using init() function 
Init a:3, b:5 
Multiply a:0, b:0, res:0 
result:0 

set values of a and b directly 
Multiply a:3, b:5, res:15 
result:15 

합니다.
아무도이 코드의 문제점을 찾아 내도록 도와 줄 수 있습니까?
감사합니다.

+1

함수 매개 변수로 'STR_X2 *'를 사용해야하거나이 코드 중 어느 것도 전혀 의미가 없습니다. – Lundin

+0

코드가 끔찍하게도 OOP의 가장 기본적인 규칙 인 개인 캡슐화에 위배됩니다. – Lundin

+0

'int (* multiply) (int, int)')를 사용하지 않고'int (* func)()'를 사용하면 코드가 안전하지 않게됩니다. 나는 또한 "클래스 초기화"함수 ("init' 함수, 그러나 다르게 명명 된) 내에서"인스턴스 "를 초기화하는 것을 고려할 것이다. 또한 중첩 된 함수를'static'으로 만들 것입니다. 왜냐하면 파일 외부에서 액세스되지 않기 때문에 할당 된 객체를 통해서만 액세스해야하기 때문입니다. – Myst

답변

1

initmultiplySTR_X2을 값으로 사용하고 있습니다. 이로 인해 사본이 생성됩니다. 대신 포인터로 가져가 main에 선언 된 static 인스턴스를 수정하십시오.