¡Ô ÇÁ·Î±×·¡¹Ö ¼ÒÇ° ¹× ÆÁ

 ¡å Protected ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î

C++

N/A

Protected¸¦ ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ±â·Á¸é Å©°Ô µÎ °¡Áö°¡ ÇÊ¿äÇÏ´Ù. ù°´Â protected¿¡ ´ëÇÑ ±ÇÇÑÀÌ ¾øÀ» ¶§ Á¢±ÙÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ °ÍÀÌ°í ¶Ç Çϳª´Â ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ°Ü¼­ ½ÇÇàÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ °ÍÀÌ´Ù.

ù ¹ø°¿¡ ´ëÇÑ À̾߱â´Â ÀÌÀü ÆÁ¿¡¼­ ¾ð±ÞµÈ °ÍÀ̱⠶§¹®¿¡ »ý·«ÇÏ°í µÎ ¹ø°¿¡ ´ëÇÑ °Í¸¸ À̾߱â ÇÏ°Ú´Ù. ÀϹÝÀûÀ¸·Î C¿¡¼­ ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ±â±â À§Çؼ­´Â

    void Print(void (*fnPrint)(const char*))

¿Í °°Àº ¹æ¹ýÀ¸·Î ¼±¾ðÇÏ¸é µÇ¾ú´Ù. ±×·±µ¥ classÀÇ ¸â¹ö ÇÔ¼öÀÇ °æ¿ì¿¡´Â Á¶±Ý ´Ù¸¥ ¹®¹ýÀ» »ç¿ëÇØ¾ß Çϴµ¥, CA¶ó´Â class ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ¹Þ´Â ´ÙÀ½ ´ÙÀ½°ú °°ÀÌ µÈ´Ù..

    void Print(void (CA::*fnPrint)(const char*))

¾Õ ÂÊ¿¡ CA¶ó´Â class¸¦ ÀǹÌÇÏ´Â namespace Ç¥½Ã¸¦ Ãß°¡ÇÏ´Â ¹æ¹ýÀ¸·Î ÇØ°áµÇ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô Çؼ­ class ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î º¸³¾ ¼ö°¡ ÀÖÁö¸¸ ÀÌ·¸°Ô ¹ÞÀº ÆĶó¹ÌÅ͸¦ Á÷Á¢ ½ÇÇàÇÏÁö´Â ¸øÇÑ´Ù. À§¿Í °°Àº ¼±¾ðÀ̶ó¸é ´Ü¼øÇÑ ÆĶó¹ÌÅÍÀÏ»ÓÀÌÁö ½ÇÇà °¡´ÉÇÑ ÇÔ¼ö ÇüŶó°í´Â º¼ ¼ö ¾ø±â ¶§¹®ÀÌ´Ù. (ÇÏÁö¸¸ C ÇüÅÂÀÇ ÇÔ¼ö ÆĶó¹ÌÅÍ´Â ½ÇÇà±îÁö °¡´ÉÇÏ´Ù) ±× ÀÌÀ¯´Â class ¸â¹ö ÇÔ¼ö´Â ¾Ï¹¬ÀûÀ¸·Î this¸¦ Æ÷ÇÔÇÏ¿©¾ß Çϱ⠶§¹®¿¡ ½º½º·Î ½ÇÇàÀº ºÒ°¡´É ÇÑ °ÍÀÌ´Ù. ±×·¸´Ù¸é °á±¹ this°¡ µÇ´Â class ÀνºÅϽºµµ ³Ñ°Ü ÁÖ¾î¾ß Çϱ⠶§¹®¿¡ ´ÙÀ½°ú °°Àº ÇüÅ°¡ µÇ¾î¾ß ÇÑ´Ù.

    void Print(CA* pThis, void (CA::*fnPrint)(const char*))

À̷μ­ this¿Í class ¸â¹ö º¯¼ö°¡ ¸ðµÎ Àü´Þ µÇ¾ú´Ù. ÇÏÁö¸¸ ÇϳªÀÇ ³­°üÀÌ ´õ ³²¾Æ ÀÖ´Ù. ÀÌ 2°³ÀÇ ÆĶó¹ÌÅ͸¦ ¾î¶»°Ô Á¶ÇÕÇÏ´À³Ä´Â °ÍÀÌ ¹®Á¦ÀÌ´Ù. ±× ¹æ¹ýµµ CÀÇ °æ¿ì¸¦ Á¶±Ý ÀÀ¿ëÇØ º¸¸é °á·ÐÀÌ ³ª¿À´Âµ¥ ´ÙÀ½°ú °°ÀÌ ÇÏ¸é µÈ´Ù.

    (pThis->*fnPrint)("first parameter");

ÀÌ Àüü¸¦ Å×½ºÆ® Çϱâ À§Çؼ­ ´ÙÀ½ÀÇ test case¸¦ ¸¸µé¾î º¸¾Ò´Ù.

    01: #include <iostream>
    02:
    03: class CA
    04: {
    05:     int m_data;
    06:
    07: protected:
    08:     void _Print(const char* szText)
    09:     {
    10:         std::cout << szText << "(" << m_data << ")" << std::endl;
    11:     }
    12: public:
    13:     CA(int data): m_data(data) {};
    14: };
    15:
    16: /////////////////////////////////////////////////////////
    17: // ÆĶó¹ÌÅÍ·Î ¹ÞÀº this¿Í ¸â¹ö ÇÔ¼ö¸¦ Á¶ÇÕÇÑ´Ù
    18: void PrintProxy(CA* pThis, void (CA::*_Print)(const char*),
                        const char* szText)
    19: {
    20:     (pThis->*_Print)(szText);
    21: };
    22:
    23: /////////////////////////////////////////////////////////
    24: // ÆĶó¹ÌÅÍ·Î ¹ÞÀº thisÀÇ protected ¸â¹ö ÇÔ¼ö¸¦ ÆĶó¹ÌÅÍ·Î ³Ñ±ä´Ù.
    25: void PrintProxy(CA* pThis, const char* szText)
    26: {
    27:     class CB: public CA
    28:     {
    29:     public:
    30:         CB(int data): CA(data) {};
    31:         void Print(const char* szText)
    32:         {
    33:             PrintProxy(this, &CB::_Print, szText);
    34:         }
    35:     };
    36:
    37:     static_cast<CB*>(pThis)->Print(szText);
    38: }
    39:
    40: /////////////////////////////////////////////////////////
    41: // TEST CASE
    42: int main(void)
    43: {
    44:     CA a(100);
    45:
    46:     // aÀÇ protected ÇÔ¼öÀÎ _Print()¸¦ ÀÌ¿ëÇØ ¹®ÀÚ¸¦ Ãâ·Â
    47:     PrintProxy(&a, "my message");
    48:
    49:     return 0;
    50: }