티스토리 뷰

프로그래밍/관리C++

위임 Delegate

에어버스 2018. 4. 7. 15:10

위임 Delegate

1개 또는 그 이상의 함수를 호출한다.

먼저, 1행처럼 호출할 함수를 Delegate 로 선언한다.

Invoke() : 위임한 함수 호출
Delegate::Combine() : 다중 호출할 함수를 지정
Delegate::Remove() : Combine한 함수를 리스트에서 삭제 

26행은 pOp는 square() 만 호출,
31행은 pOp3은 square() 와 square3() 2개 호출한다.
33행은 pOp4는 square(), square3(), square() 3개를 호출한다.
43행은 pOp4에서 pOp5 즉, square() 를 리스트에서 삭제하고 square()와 square3() 2개만 호출한다.
44행에서 pOp6는 pOp3과 같이 함수 호출하게 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public delegate double NumericOp(double);
 
ref class Ops
{
public:
    static double square(double d)
    {
        Console::WriteLine("square");
        return d * d;
    }
    static double square3(double d)
    {
        Console::WriteLine("square3");
        return d * d * d;
    }
};
 
//__gc public CppForm : public Form // 1세대용
public ref class CppForm : public Form
{
public:
    CppForm() {};
};
 
int main(array<System::String ^> ^args)
{
    //Ops^ a = gcnew Ops;
    NumericOp^ pOp = gcnew NumericOp(&Ops::square); // new 대신 gcnew, * 대신 ^ 사용
    NumericOp^ pOp2 = gcnew NumericOp(&Ops::square3); // new 대신 gcnew, * 대신 ^ 사용
    NumericOp^ pOp5 = gcnew NumericOp(&Ops::square); // new 대신 gcnew, * 대신 ^ 사용
 
    NumericOp^ pOp3 = dynamic_cast<NumericOp^>(Delegate::Combine(pOp, pOp2));
    NumericOp^ pOp4 = dynamic_cast<NumericOp^>(Delegate::Combine(pOp3, pOp5));
    double result = pOp->Invoke(3.0);
    Console::WriteLine("Result : {0}", result);
    result = pOp2->Invoke(3.0);
    Console::WriteLine("Result : {0}", result);
    Console::WriteLine("=================================================");
    result = pOp3->Invoke(3.0);
    Console::WriteLine("=================================================");
    result = pOp4->Invoke(3.0);
    Console::WriteLine("=================================================");
    NumericOp^ pOp6 = dynamic_cast<NumericOp^>(Delegate::Remove(pOp4, pOp5));
    result = pOp6->Invoke(3.0);
 
    Console::ReadKey();
}
cs

 

실행결과>

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30