在linux下面如果想要导出一个类,可以通过虚拟继承一个基类,通过基类的指针来访问导出的类。
代码如下:
头文件的定义,通过函数Getpmmethod来导出该类。
#define _PMMETHOD_H
class pmth
{
public:
//pmth(int a,int b)=0;
//pmth(){};
virtual ~pmth(){};
virtual int plus()=0;
virtual int minor()=0;
virtual int mutiply()=0;
virtual int divide()=0;
};
class pmmethod:virtual public pmth
{
public:
pmmethod(int a,int b);
~pmmethod();
virtual int plus();
virtual int minor();
virtual int mutiply();
virtual int divide();
void print();
private:
int m_a;
int m_b;
};
extern "C" pmth * Getpmmethod(int a, int b);
#endif
类的实现部分:
#include "pmmethod.h"
#include <stdio.h>
pmth* Getpmmethod(int a,int b)
{
printf("Getpmmethod()\n");
return (new pmmethod(a,b));
}
pmmethod::pmmethod(int a,int b)
{
m_a = a;
m_b = b;
}
pmmethod::~pmmethod()
{}
void pmmethod::print()
{
printf("m_a =%d,m_b = %d\n",m_a,m_b);
}
int pmmethod::plus()
{
print();
return m_a+m_b;
}
int pmmethod::minor()
{
return m_a-m_b;
}
int pmmethod::mutiply()
{
return m_a*m_b;
}
int pmmethod::divide()
{
if(m_b != 0 )
{
return (m_a/m_b);
}
printf("the divider is zero!\n");
}
执行代码调用类的实现部分。
#include <dlfcn.h>
#include <stdio.h>
#include "pmmethod.h"
#include <stdint.h>
pmth* (*getpmmethod)(int,int);
int main()
{
void *dlh = dlopen("libpm.so",RTLD_LAZY);
const char *dlError = dlerror();
if(dlError)
{
printf("dlopen error %s!\n",dlError);
}
getpmmethod = (pmth*(*)(int,int))(uintptr_t)dlsym(dlh,"Getpmmethod");
pmth * pm = getpmmethod(4,2);
printf("plus = %d\n",pm->plus());
printf("minor = %d\n",pm->minor());
printf("mutiply = %d\n",pm->mutiply());
printf("divide = %d\n",pm->divide());
delete pm;
dlclose(dlh);
}
通过这种方式就可以导出这个类。