c++动态库导出类方法:

无人久伴 提交于 2019-11-29 06:19:56

方法一:利用_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++的设计思想及多态类的实现思想的应用。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!