C++接口的定义与实现

1.接口的定义与实现

所谓的接口,即将内部实现细节封装起来,外部用户用过预留的接口可以使用接口的功能而不需要知晓内部具体细节。C++中,通过类实现面向对象的编程,而在基类中只给出纯虚函数的声明,然后在派生类中实现纯虚函数的具体定义的方式实现接口,不同派生类实现接口的方式也不尽相同,从而实现多态。现通过一个简单的实例讲解具体实现步骤(⊙o⊙)。

1.1类接口的定义    通常在头文件中完成类接口的定义 /*InterfaceDefineAndRealize.h*/

#ifndef INTERFACE_DEFINE_AND_REALIZE
#define INTERFACE_DEFINE_AND_REALIZE
#include <string>
using std::string;
//define interface
class Person
{
public:
	Person():m_StrName("###") //成员列表初始化参数
	{};
	virtual ~Person(){};
	virtual void Eat()=0;//人需要吃东西
	virtual void Sleep()=0;//人需要睡觉
	virtual void SetName(const string strName)=0;//人都有名字
	virtual string GetName()=0;//获取名字
	virtual void Work()=0;//人可能要有工作
private:
	string m_StrName;
};
//实现接口
//实现接口是通过派生类实现的,每个派生类依据自身特点,可以获取同一接口的不同实现
//也就是所谓的多态
class Student:public Person
{
public:
	Student():m_strName("***")
	{};
	~Student()
	{};
	void Eat();
	void Sleep();
	void SetName(const string strName);
	string GetName();
	void Work();
private:
	string m_strName;
};
#endif
1.2 接口的实现  通常在源文件中完成接口的实现 /*InterfaceDefineAndRealize.cpp*/

#include "InterfaceDefineAndRealize.h"
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;

//接口的外部实现
void Student::Sleep()
{
	cout<<"student sleep."<<endl;
}
void Student::Eat()
{
	cout<<"student eat."<<endl;
}
void Student::SetName(const string strName)
{
	m_strName=strName;
}
void Student::Work()
{
	cout<<"student work."<<endl;
}
string Student::GetName()
{
	return m_strName;
}
//需要导出的函数,即用户在外部可以调用的接口
_declspec(dllexport)bool GetPersonObject(void** _RtObject)
{
	Person* pMan=NULL;
	pMan=new Student();
	*_RtObject=(void*)pMan;
	return true;
}

1.3 接口的导出  通常在模块定义文件中完成 /*InterfaceDefineAndRealize.def*/

LIBRARY InterfaceDefineAndRealize
EXPORTS
GetPersonObject

新建项目,加载上述三个文件,设置项目属性—>配置属性——>常规——>配置类型 ,选择"动态库.dlll",生成可用的动态库,假如项目名称为InterfaceDefineAndRealize(注意:项目名称必须与模块定义文件中 LIBRARY 后面定义的名字相同,否则将导致出现无法找到动态库的错误。),则在该项目的当前工作目录下位生成动态库和它的导入库。

2. 接口的调用

为了与常规的调用动态库的方式保持一致,这里做一些额外工作。新建“include”文件夹,并将InterfaceDefineAndRealize.h放到此文件夹下,新建“lib”文件夹并将InterfaceDefineAndRealize.lib文件放到此文件夹下。新建项目UsingInterface,添加源文件实现调用接口的功能。

2.1 为项目添加附加包含目录

方法1:项目属性——>配置属性——>C/C++——>常规——>附加包含目录 将include文件夹的全路径添加进来。

方法2:项目属性——>配置属性——>VC++目录——>包含目录 中将include文件夹的全路径添加进来。

2.2 为项目添加附加库

方法1:项目属性——>配置属性——>链接器——>常规——>附加库目录  将lib文件夹的全路径添加进来。

方法2:项目属性——>配置属性——>VC++目录——>库目录  将lib文件夹的全路径添加进来。

注意:2.1中的方法1与2.2中的方法1对应,2.1中的方法2与2.2中的方法2对应,不能不换使用。

2.3 为项目添加导入库

项目属性——>配置属性——>链接器——>输入——>附加依赖项  中添加InterfaceDefineAndRealize.lib

2.4 为项目提供动态库

将生成的.dll动态库放到项目的当前目录下的Debug目录下,防止出现缺少动态库的错误。

2.5  编写代码,实现接口的调用

#include <iostream>
#include "InterfaceDefineAndRealize.h"
bool _declspec(dllimport) GetPersonObject(void** _RtObject);
int main()
{
	Person* person=NULL;
	void* pObj=NULL;
	if(GetPersonObject(&pObj))//调用接口
	{
		person=(Person*)pObj;
		person->Eat();
		person->Sleep();
		person->SetName("zhang hui");
		std::cout<<person->GetName()<<std::endl;
		person->Work();

		if(person!=NULL)
		{
			delete person;
			person=NULL;
		}
	}
	system("pause");
	return 0;
}

注:以上代码仅为个人理解,可能存在错误或叙述不正确的地方,希望给予指正,谢谢。



  • 54
    点赞
  • 297
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
物联网加密算法主要是为了保护物联网设备和数据的安全,可以使用对称加密算法和非对称加密算法进行实现。下面我介绍一下如何使用C++实现一种常见的对称加密算法AES。 AES是一种高级加密标准(Advanced Encryption Standard),它是一种对称加密算法,即加密和解密使用的是相同的密钥。在使用AES加密之前,我们需要先生成一个密钥,然后使用该密钥对数据进行加密和解密。 以下是使用C++实现AES加密的基本步骤: 1. 下载和安装OpenSSL库,这是一种开源的加密库,支持多种加密算法。 2. 导入OpenSSL头文件和库文件。 3. 生成AES密钥,可以使用OpenSSL库中的函数进行生成。 4. 使用生成的密钥对数据进行加密和解密,可以使用OpenSSL库中的EVP接口进行操作。 下面是一个简单的示例代码: ```c++ #include <iostream> #include <openssl/aes.h> using namespace std; int main() { // 初始化加密算法 OpenSSL_add_all_algorithms(); // 生成AES密钥 unsigned char key[AES_BLOCK_SIZE]; memset(key, 0, sizeof(key)); AES_KEY aes_key; AES_set_encrypt_key(key, 128, &aes_key); // 加密数据 unsigned char plaintext[] = "Hello, World!"; unsigned char ciphertext[sizeof(plaintext)]; AES_encrypt(plaintext, ciphertext, &aes_key); // 解密数据 unsigned char decrypted[sizeof(plaintext)]; AES_decrypt(ciphertext, decrypted, &aes_key); // 输出结果 cout << "Plaintext: " << plaintext << endl; cout << "Ciphertext: " << ciphertext << endl; cout << "Decrypted: " << decrypted << endl; // 清理加密算法 EVP_cleanup(); return 0; } ``` 需要注意的是,密钥的长度通常为128位、192位或256位,本示例中使用的是128位密钥。此外,为了保证加密和解密的正确性,加密前的数据长度应该是16的倍数。 以上是一个简单的AES加密算法的实现,可以根据具体需求进行调整和优化。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只特立独行的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值