方法一:利用_declspec(dllexport)
这种简单导出类的方式,除了导出的东西太多,使用者对类的实现依赖太多之外,还有必须保证使用同一种编译器。
导出类的本质是导出类里面的函数,因为语法上直接导出了类,没有对函数的调用方式和重命名进行设置,导致了dll并不通用。
//导出C++类
class _declspec(dllexport) Stu
{
public:
Stu(int id);
void print();
private:
int id;
};
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "009.h"
Stu::Stu(int id)
{
this->id=id;
}
void Stu::print()
{
cout<<"id="<<id<<endl<<endl;
}
#include <iostream>
#include "../009/009.h"
#pragma comment(lib,"../Debug/009.lib")
int main()
{
Stu s(123);
s.print();
return 0;
}
方法二:较好的方式
定义一个抽象类(都是纯虚函数),调用者跟dll共用一个抽象类的头文件。DLL实现此抽象类的派生类。DLL最少只需要提供一个用于获取抽象类对象指针的接口。
//更好的导出类的方式
//1、创建接口类
class IAnimal
{
public:
virtual void eat()=0;
virtual void sleep()=0;
};
//2、利用一个函数导出此类
_declspec(dllexport) IAnimal* GetCat();
//3、释放对象
_declspec(dllexport) bool DelCat(IAnimal* animal);
// 009.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
#include "009.h"
//实现接口类
class Cat:public IAnimal
{
public:
Cat(int age)
{
this->age=age;
}
virtual ~Cat()
{
cout<<"Cat Delete"<<endl<<endl;
}
virtual void eat()
{
cout<<"Cat eat"<<endl<<endl;
}
virtual void sleep()
{
cout<<"Cat Sleep"<<endl<<endl;
}
private:
int age;
};
//2、利用一个函数导出此类
_declspec(dllexport) IAnimal* GetCat()
{
return new Cat(6);
}
//3、释放对象
_declspec(dllexport) bool DelCat(IAnimal* animal)
{
delete (Cat *)animal;
return true;
}
#include <iostream>
#include "../009/009.h"
#pragma comment(lib,"../Debug/009.lib")
int main()
{
// Stu s(123);
// s.print();
IAnimal* pCat=GetCat();
pCat->eat();
pCat->sleep();
DelCat(pCat);
return 0;
}
C++的设计思想及多态类的实现思想的应用。
来源:https://blog.csdn.net/weixin_41211961/article/details/100535025