2012. 7. 13. 14:51

// Listing 15.9.
// Using typedef to make pointers to functions more readable

#include <iostream>
using namespace std;

void Square (int&,int&);
void Cube (int&, int&);
void Swap (int&, int &);
void GetVals(int&, int&);
typedef  void (*VPF) (int&, int&) ;
void PrintVals(VPF,int&, int&);

int main()
{
        int valOne=1, valTwo=2;
        int choice;
        bool fQuit = false;

        VPF pFunc;

        while (fQuit == false)
        {
                cout << "(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: ";
                cin >> choice;
                switch (choice)
                {
                case 1:        pFunc = GetVals; break;
                case 2:        pFunc = Square; break;
                case 3:        pFunc = Cube; break;
                case 4:        pFunc = Swap; break;
                default:fQuit = true; break;
                }
                if (fQuit == true)
                        break;
                PrintVals ( pFunc, valOne, valTwo);
        }
        return 0;
}

void PrintVals( VPF pFunc,int& x, int& y)
{
        cout << "x: " << x << " y: " << y << endl;
        pFunc(x,y);
        cout << "x: " << x << " y: " << y << endl;
}

void Square (int & rX, int & rY)
{
        rX *= rX;
        rY *= rY;
}

void Cube (int & rX, int & rY)
{
        int tmp;

        tmp = rX;
        rX *= rX;
        rX = rX * tmp;

        tmp = rY;
        rY *= rY;
        rY = rY * tmp;
}

void Swap(int & rX, int & rY)
{
        int temp;
        temp = rX;
        rX = rY;
        rY = temp;
}

void GetVals (int & rValOne, int & rValTwo)
{
        cout << "New value for ValOne: ";
        cin >> rValOne;
        cout << "New value for ValTwo: ";
        cin >> rValTwo;
}


(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 1
x: 1 y: 2
New value for ValOne: 2
New value for ValTwo: 3
x: 2 y: 3
(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 3
x: 2 y: 3
x: 8 y: 27
(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 2
x: 8 y: 27
x: 64 y: 729
(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 4
x: 64 y: 729
x: 729 y: 64
(0)Quit (1)Change Values (2)Square (3)Cube (4)Swap: 0

---------------------------------------------------------------------------------

전 예제를 간단히 하기 위해서 typedef문을 사용함
즉 void 를 반환하고 두개의 형수형 참조자를 취하는 함수 포인터의 형으로 선언하는 것이다.
이를 VPF(void pointer function)이라고 한다.
10번째줄에서 typedef가 사용되었는데 VPF를 void형으로 반환하고 두개의 정수를 참조자를
매개변수로 갖는 함수로 선언하였다.
19번 줄에서 pFunc는 VPF형으로 선언되었다.

Posted by 몰라욧