C++

클래스 멤버 함수 포인터

developer-tj 2023. 2. 15. 12:00
반응형

클래스 멤버 함수 포인터는 다음과 같이 사용한다.

 

#include <iostream>

class Calculator
{
public:
    int Add(int a, int b)
    {
        return a + b;
    }
};

int main()
{
    Calculator cal;
    
    //일반 클래스 함수 사용
    int result = cal.Add(1,2);
    std::cout << "일반 클래스 함수 사용 cal.Add(1,2) : " << result << std::endl;

    //클래스 함수 포인터 pAdd 선언
    int (Calculator::*pAdd)(int, int);
    pAdd = &(Calculator::Add);  //클래스 함수인 경우에는 주소인지 알 수 있도록 &가 추가되어야 한다.
    result = (cal.*pAdd)(1, 2); //클래스 함수이기 때문에 실제 객체(cal)에서 호출해줘야 한다. 
                                //함수포인터인지 알 수 있도록 *를 붙여서 사용한다.
    std::cout << "클래스 함수 포인터 사용 (cal.*pAdd)(1, 2) : " << result << std::endl;

    //동적 할당 시 사용법
    Calculator* pCal = new Calculator();
    result = ((*pCal).*pAdd)(1,2);
    std::cout << "클래스 포인터 사용 ((*pCal).*pAdd)(1,2) : " << result << std::endl;
    result = (pCal->*pAdd)(1, 2);   // *객체.  ==  객체->
    std::cout << "클래스 포인터 사용 ((*pCal).*pAdd)(1,2) : " << result << std::endl;
    delete pCal;

    ///typedef 사용
    typedef int (Calculator::*CALSS_FUNC_TYPE)(int, int);
    CALSS_FUNC_TYPE pAdd2;
    pAdd2 = &(Calculator::Add);
    result = (cal.*pAdd2)(1, 2);
    std::cout << "클래스 함수 포인터(typedef) 사용 (cal.*pAdd)(1, 2) : " << result << std::endl;

    //using 사용
    using CALSS_FUNC_TYPE2 = int (Calculator::*)(int, int);
    CALSS_FUNC_TYPE2 pAdd3;
    pAdd3 = &(Calculator::Add);
    result = (cal.*pAdd3)(1, 2);
    std::cout << "클래스 함수 포인터(using) 사용 (cal.*pAdd)(1, 2) : " << result << std::endl;

    return 0;
}

'C++' 카테고리의 다른 글

std::variant  (0) 2023.04.06
함수 포인터  (0) 2023.02.14