函数的动态链接如下:(经调试已经正常运行)
如下:
#include "stdio.h"void Test1()
{
        printf("Function is Test1.\n");
}
void Test2()
{
        printf("Function is Test2.\n");
}
void Test3()
{
        printf("Function is Test3.\n");
}
typedef void(*lpTestFunc[])();
lpTestFunc TestFunc = {Test1,Test2,Test3};
int main(int argc, char* argv[])
{
        for(int i = 0;i < 3;i ++)
        {
                TestFunc[i]();
        }
        getchar();
        return 0;
}
我要把上面这段程序封装成一个CTest的类 我尝试改写如下:
class CTest
{
       typedef void(CTest::* lpTestFunc[])(void);
public:
        CTest()
        {
                TestFunc[0] = &CTest::Test1;
                TestFunc[1] = &CTest::Test2;
                TestFunc[2] = &CTest::Test3;
        }
public:
        lpTestFunc      TestFunc;
private:
        void Test1()
        {
                printf("Function is Test1.\n");
        }
        void Test2()
        {
                printf("Function is Test2.\n");
        }
        void Test3()
        {
                printf("Function is Test3.\n");
        }
};
我在main函数中应该如何调用呢?
int main()
{
     CTest  ct;
     for(int i = 0;i < 3;i ++)
     {
     
     }
     return 0;
}
谢谢指教。我的QQ52418130,Email:[email protected]

解决方案 »

  1.   

    1.指向类内的函数的指针,头上会有thiscall,而VC不支持,所以你的封装会能问题
      (用BCB 有_closure 关键字,可以指向类内的函数的指针)
    2.类内封装时,TestFunc不确定数组大小,可能会越界
    3.类内可用static封装
    以下程序可以通过
     #include <stdio.h>
    class CTest
    {
           typedef void(*lpTestFunc[3])(void);
    public:
            CTest()
            {
                    TestFunc[0] = &CTest::Test1;
                    TestFunc[1] = &CTest::Test2;
                    TestFunc[2] = &CTest::Test3;
         
                    
            }
    public:
            lpTestFunc    TestFunc;  
    private:
            static void Test1()
            {
                    printf("Function is Test1.\n");
            }
            static void Test2()
            {
                    printf("Function is Test2.\n");
            }
            static void Test3()
            {
                    printf("Function is Test3.\n");
            }
    };int main()
    {
         CTest  ct;
         for(int i = 0;i < 3;i ++)
         {
            ct.TestFunc[i]();
         }
         return 0;
    }
      

  2.   

    以上的
                    TestFunc[0] = &CTest::Test1;
                    TestFunc[1] = &CTest::Test2;
                    TestFunc[2] = &CTest::Test3;
    可简写为
                    TestFunc[0] = Test1;
                    TestFunc[1] = Test2;
                    TestFunc[2] = Test3;用BCB就可写成以下的,(我以前也研究过VC,没找到指向类内函数指针的定义)#include <stdio.h>
    class CTest
    {
           typedef void(__closure * lpTestFunc[3])(void);
    public:
            CTest()
            {
                    TestFunc[0] = Test1;
                    TestFunc[1] = Test2;
                    TestFunc[2] = Test3;
         
                    
            }
    public:
            lpTestFunc    TestFunc;  
    private:
             void Test1()
            {
                    printf("Function is Test1.\n");
            }
             void Test2()
            {
                    printf("Function is Test2.\n");
            }
            void Test3()
            {
                    printf("Function is Test3.\n");
            }
    };int main()
    {
         CTest  ct;
         for(int i = 0;i < 3;i ++)
         {
            ct.TestFunc[i]();
         }
         return 0;
    }
      

  3.   

    谢谢你 keiy !我在BCB中调试通过了 !在VC中仍然不行 我继续尝试
      

  4.   

    以下为调试通过代码:
    class CTest
    {
           typedef void(__closure* lpTestFunc[3])(void);
    public:
            CTest()
            {
                    ///TestFunc = {&CTest::Test1,&CTest::Test2,&CTest::Test3};
                    TestFunc[0] = Test1;
                    TestFunc[1] = Test2;
                    TestFunc[2] = Test3;
            }
    public:
            lpTestFunc      TestFunc;
    private:
            void Test1()
            {
                    printf("Function is Test1.\n");
            }
            void Test2()
            {
                    printf("Function is Test2.\n");
            }
            void Test3()
            {
                    printf("Function is Test3.\n");
            }
    };int main(int argc, char* argv[])
    {
            CTest ct;
            for(int i = 0;i < 3;i ++)
            {
                    ct.TestFunc[i]();
            }
            getchar();
            return 0;
    }如果成员函数改称static声明 编译无法通过错误代码为:
    E2034 Cannot convert 'void (*)()' to 'void (* (_closure )())()'