C++의 멤버 함수에 대한 함수 포인터

Jay Shaw 2023년10월12일
  1. C++에서 멤버 함수에 대한 함수 포인터 구현
  2. C++에서 멤버 함수에 대한 포인터 부착
  3. C++에서 포인터 기호를 사용하지 않고 멤버 함수에 대한 포인터 호출
  4. C++에서 함수 포인터와 동일한 클래스의 메서드 제공
  5. C++에서 문자열 명령을 사용하여 멤버 함수에 대한 함수 포인터
C++의 멤버 함수에 대한 함수 포인터

변수가 프로그래밍 언어로 생성되면 기계는 그 값을 컴퓨터 메모리에 저장해야 합니다. 기계는 비어 있든 없든 이 변수에 약간의 메모리를 할당합니다.

변수 값 대신 위치가 필요한 경우가 많습니다. 이 시간 동안 포인터를 통해 이러한 값을 가져올 수 있습니다.

또한 C++의 포인터는 메모리 주소를 참조하는 것과 비교하여 함수와 같은 코드를 가리키는 데 사용할 수도 있습니다. 이를 함수 포인터라고 하며 코드의 효율성을 높입니다.

이 기사의 예제는 C++에서 포인터가 멤버 함수를 가리키도록 하기 위해 클래스 내에서 함수 포인터를 사용하는 방법을 명확하게 보여줍니다.

C++에서 멤버 함수에 대한 함수 포인터 구현

이를 수행할 수 있는 두 가지 방법이 있습니다.

  1. 멤버 함수를 가리키는 함수 포인터가 생성됩니다.
  2. 함수 포인터의 이름만 사용하여 메서드를 호출합니다.

C++에서 멤버 함수에 대한 포인터 부착

포인터 기능을 사용하려면 다음 단계가 필요합니다.

  1. 반환 유형이 있는 매개변수화된 함수 - void.
  2. 포인터 변수 캐스팅을 입력합니다.
  3. 포인터 변수를 메서드에 할당합니다.
  4. 포인터를 사용하여 메인 함수 내에서 매개변수화된 함수를 호출하는 메소드 호출.

표준 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;

포인터 ptrvar1 객체 클래스와 함께 사용되며 foo 메서드가 할당됩니다. 생성자로서 메서드는 :: 기호를 사용하여 할당되어야 하며, 이는 함수가 assgnPrt 클래스의 멤버 메서드임을 나타냅니다.

마지막으로 결과를 인쇄해야 합니다.

printf("%c\n", (var1.*(var1.ptr))());

이해하기가 매우 복잡하기 때문에 독자에게 문제가 될 수 있습니다. 따라서 명확하게 이해하기 위해 조각으로 나눌 필요가 있습니다.

var1.ptrassgnPtr 클래스의 멤버 함수에 대한 포인터입니다. 하지만 *(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/oiostream과 문자열 명령용 string의 두 가지 가져오기 기능을 사용합니다. 생성자 클래스 assgnPtr2가 생성됩니다.

두 개의 비공개 멤버 displaypass_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

관련 문장 - C++ Pointer