C++의 멤버 함수에 대한 함수 포인터
- C++에서 멤버 함수에 대한 함수 포인터 구현
- C++에서 멤버 함수에 대한 포인터 부착
- C++에서 포인터 기호를 사용하지 않고 멤버 함수에 대한 포인터 호출
- C++에서 함수 포인터와 동일한 클래스의 메서드 제공
- C++에서 문자열 명령을 사용하여 멤버 함수에 대한 함수 포인터
변수가 프로그래밍 언어로 생성되면 기계는 그 값을 컴퓨터 메모리에 저장해야 합니다. 기계는 비어 있든 없든 이 변수에 약간의 메모리를 할당합니다.
변수 값 대신 위치가 필요한 경우가 많습니다. 이 시간 동안 포인터를 통해 이러한 값을 가져올 수 있습니다.
또한 C++의 포인터는 메모리 주소를 참조하는 것과 비교하여 함수와 같은 코드를 가리키는 데 사용할 수도 있습니다. 이를 함수 포인터라고 하며 코드의 효율성을 높입니다.
이 기사의 예제는 C++에서 포인터가 멤버 함수를 가리키도록 하기 위해 클래스 내에서 함수 포인터를 사용하는 방법을 명확하게 보여줍니다.
C++에서 멤버 함수에 대한 함수 포인터 구현
이를 수행할 수 있는 두 가지 방법이 있습니다.
- 멤버 함수를 가리키는 함수 포인터가 생성됩니다.
- 함수 포인터의 이름만 사용하여 메서드를 호출합니다.
C++에서 멤버 함수에 대한 포인터 부착
포인터 기능을 사용하려면 다음 단계가 필요합니다.
- 반환 유형이 있는 매개변수화된 함수 - void.
- 포인터 변수 캐스팅을 입력합니다.
- 포인터 변수를 메서드에 할당합니다.
- 포인터를 사용하여 메인 함수 내에서 매개변수화된 함수를 호출하는 메소드 호출.
표준 stdio
패키지는 프로그램 내부의 입력/출력 기능을 위해 가져옵니다. 함수 display
는 정수 데이터 유형과 함께 var1
매개변수로 선언됩니다.
void display(int var1) { printf("The variable holds value = %d\n", var1); }
display
메소드 내부에 var1
이 인쇄됩니다.
변수 ptr_method
의 데이터 유형은 주 함수 내에서 void입니다. void는 C++에서 데이터 유형으로 사용할 수 있지만 자리 표시자 역할을 하며 실제로 데이터 유형을 나타내지는 않습니다.
선언된 포인터 변수는 다음과 같이 정수 매개변수와 함께 제공됩니다.
void (*ptr_method)(int)
ptr_method
에는 정수 매개변수가 있습니다. 이것은 ptr_method
를 호출하는 동안 멤버 메소드에 값을 전달합니다.
다른 데이터 유형을 사용하면 컴파일러에서 잘못된 변환 오류가 발생하기 때문에 포인터 함수 ptr_method
에 void 데이터 유형이 지정되었습니다.
함수 포인터는 아래 구문을 사용하여 프로그램 시작 시 선언된 함수에 할당됩니다. 포인터가 디스플레이
기능을 가리키도록 하려면 다음 구문을 사용하십시오.
ptr_method = &display;
마지막으로 포인터 함수는 "65"
로 제공된 정수 매개변수로 호출됩니다.
암호:
#include <stdio.h>
// This method has a parameter int and a return type which is void
void display(int var1) { printf("The variable holds value = %d\n", var1); }
int main() {
void (*ptr_method)(int);
ptr_method = &display;
(*ptr_method)(65);
return 0;
}
출력:
The variable holds value = 65
C++에서 포인터 기호를 사용하지 않고 멤버 함수에 대한 포인터 호출
이 예제에서 사용된 프로그램은 함수 호출을 제외하고는 위와 동일합니다. 여기서 포인터 변수는 별표(*
)를 제외한 변수 이름을 사용하여 호출됩니다.
함수 포인터가 메서드를 가리키면 내부에 저장된 메서드의 메모리 주소에 포인터와 변수 형식을 모두 사용하여 액세스할 수 있기 때문에 프로그램이 의도한 대로 작동합니다. 예를 들어 함수 포인터 ptr_method
가 정의되어 있을 때 이전 예제와 같이 변수 이름 앞에 &
를 추가하는 대신 변수 이름을 직접 활용하여 display
기능 할당이 수행됩니다.
함수 호출 시 함수 포인터 ptr_method
는 포인터 기호(*
) 없이 직접 호출되고 54
값을 전달합니다.
void (*ptr_method)(int);
ptr_method = display;
ptr_method(54);
암호:
#include <stdio.h>
void display(int var1) { printf("The variable holds value = %d\n", var1); }
int main() {
void (*ptr_method)(int);
ptr_method = display;
ptr_method(54);
return 0;
}
출력:
The variable holds value = 54
C++에서 함수 포인터와 동일한 클래스의 메서드 제공
이 예제에서 사용된 프로그램은 다른 두 프로그램과 유사합니다. 그러나 여기에서 포인터는 메서드인 반면 작업은 다른 두 프로그램에서 간단한 포인터 변수에 의해 처리되었습니다.
생성자 클래스 assgnPtr
은 char 메소드 foo와 함수 포인터 ptr
인 또 다른 char 메소드의 두 가지 공개 멤버로 생성됩니다. 두 가지 방법은 아래 구문에 나와 있으며 구문의 마지막 줄에서 함수 포인터에 대해 assgnPtr
클래스를 가리키는 것이 분명합니다.
public:
char foo();
char (assgnPtr::*ptr)();
공개 메소드가 선언된 후 foo()
함수는 f
를 반환합니다. 이것은 함수 포인터가 호출될 때 프로그램이 foo
함수를 호출하고 반환된 모든 것을 인쇄한다는 것을 의미합니다.
var1
이라는 이름의 변수는 메인 메소드 내부에 선언되어 있습니다. 이 변수는 클래스 객체로 기능합니다.
멤버 함수인 함수 포인터는 같은 클래스의 객체 없이 사용할 경우 접근이 불가능하다는 단점이 있기 때문이다. 멤버 함수는 다음 구문에서 포인터 변수에 할당됩니다.
int main() {
assgnPtr var1;
var1.ptr = &assgnPtr::foo;
포인터 ptr
은 var1
객체 클래스와 함께 사용되며 foo
메서드가 할당됩니다. 생성자로서 메서드는 ::
기호를 사용하여 할당되어야 하며, 이는 함수가 assgnPrt
클래스의 멤버 메서드임을 나타냅니다.
마지막으로 결과를 인쇄해야 합니다.
printf("%c\n", (var1.*(var1.ptr))());
이해하기가 매우 복잡하기 때문에 독자에게 문제가 될 수 있습니다. 따라서 명확하게 이해하기 위해 조각으로 나눌 필요가 있습니다.
var1.ptr
은 assgnPtr
클래스의 멤버 함수에 대한 포인터입니다. 하지만 *(var1.ptr
)을 사용하면 포인터 참조로 바뀌고 *(var1.ptr
)를 출력하는 것은 ptr
이 범위 안에 있지 않기 때문에 직접 사용할 수 없다.
따라서 var1.*(var1.ptr)
으로 클래스 객체 var1
과 바인딩해야 합니다.
마지막으로 (var1.*(var1.ptr))()
는 인수 없이 메서드를 호출합니다. print 문은 함수 포인터를 사용하여 메서드가 호출될 때 반환된 값을 인쇄합니다.
전체 소스 코드:
#include <iostream>
class assgnPtr {
public:
char foo();
char (assgnPtr::*ptr)();
};
char assgnPtr::foo() { return 'f'; }
int main() {
assgnPtr var1;
var1.ptr = &assgnPtr::foo;
printf("%c\n", (var1.*(var1.ptr))());
}
출력:
f
C++에서 문자열 명령을 사용하여 멤버 함수에 대한 함수 포인터
이 예에서 프로그램은 문자열 명령을 사용하여 함수 포인터를 할당합니다. 핵심 개념은 멤버 메서드가 관계 연산자를 사용하여 포인터를 확인하고 할당한다는 점을 제외하면 비슷합니다.
이 프로그램은 i/o
용 iostream
과 문자열 명령용 string
의 두 가지 가져오기 기능을 사용합니다. 생성자 클래스 assgnPtr2
가 생성됩니다.
두 개의 비공개 멤버 display
및 pass_value
와 공용 멤버 func_ptr
이 있으며 이는 함수 포인터가 됩니다.
개인 멤버 pass_value
에는 데이터 유형 문자열의 변수 x 및 y와 함수 프로토타입 foo
의 세 가지 매개변수가 있습니다. 함수 프로토타입은 foo
매개변수가 함수에 대한 포인터가 될 것이라고 명시합니다.
메소드 display
는 포인터가 할당될 때 명령문을 인쇄합니다. func_ptr
메소드는 pass_value
메소드를 호출하고 x
& y
값을 매개변수로 전달하고 &
기호를 함수 프로토타입에 대한 인수로 사용하여 display
메소드를 연결합니다.
마지막으로 pass_value
메소드 내에서 전달된 x와 y의 값은 관계 연산자 ==
를 사용하여 비교됩니다. if 문은 x와 y의 값이 모두 일치하는 경우 메서드에 포인터 foo
를 할당합니다.
메인 함수 내에서 var
클래스 객체가 생성됩니다. 이 객체를 사용하여 func_ptr
메소드가 호출됩니다.
전체 소스 코드:
#include <iostream>
#include <string>
class assgnPtr2 {
public:
void func_ptr();
private:
void display();
void pass_value(std::string x, std::string y, void (assgnPtr2::*foo)());
};
void assgnPtr2::display() { std::cout << "Pointer Assigned\n"; }
void assgnPtr2::func_ptr() { pass_value("h", "h", &assgnPtr2::display); }
void assgnPtr2::pass_value(std::string x, std::string y,
void (assgnPtr2::*foo)()) {
if (x == y) {
(this->*foo)();
}
}
int main() {
assgnPtr2 var;
var.func_ptr();
return 0;
}
출력:
Pointer Assigned