精华内容
下载资源
问答
  • C++ 接口与导出类

    2021-12-06 11:05:33
    最近编写C++动态链接库模块,模块内有一些类需要被外部用户调用,这种情况下可以采用接口或者导出类实现这个功能。 如果导出类中没有任何其他的类对象作为成员,则直接导出类就可以用了,不过这种用法需要将类的...

    最近编写C++动态链接库模块,模块内有一些类需要被外部用户调用,这种情况下可以采用接口或者导出类实现这个功能。
    如果导出类中没有任何其他的类对象作为成员,则直接导出类就可以用了,不过这种用法需要将类的头文件公开,调用者需要引用头文件才能调用导出类的功能,例如我们定义了一个点类,头文件(PointClass.h)内容

    #pragma once
    class _declspec(dllexport) Point
    {
    public:
    	Point();
    	Point(double x,double y);
    	~Point();
    	double x, y;
    	double distToOrg();
    };
    

    源文件内容

    #include<math.h>
    #include "pointClass.h"
    
    Point::Point()
    {
    	x = 0;
    	y = 0;
    }
    Point::Point(double x, double y)
    {
    	this->x = x;
    	this->y = y;
    }
    Point::~Point()
    {
    
    }
    double Point::distToOrg()
    {
    	return pow(x * x + y * y, 0.5);
    }
    

    该类的使用,main函数如下:

    #include <stdlib.h>
    #include <time.h>
    #include<iostream>
    #include "PointClass.h"
    using namespace std;
    int main()
    {
    	//采用内部没有类对象成员的导出类
    	srand((unsigned)time(0));
    	double x = rand();
    	double y = rand();
    	Point pt(x,y);
    	cout << "point coord x=" << pt.x << " y=" << pt.y <<" distToOrg="<< pt.distToOrg()<< endl;
    	system("break");
    }
    

    可以编译,运行结果如下,可以看出导出类可以正常使用,其成员变量及函数均可使用。
    在这里插入图片描述
    也可以用接口实现上述功能,定义接口:

    #pragma once
    //IPoint.h
    class _declspec(dllexport) IPoint
    {
    	virtual double getX() = 0;
    	virtual double getY() = 0;
    	virtual void setX(double _x) = 0;
    	virtual void setY(double _y) = 0;
    	virtual double distToOrg() = 0;
    };
    
    int _declspec(dllexport)_stdcall pointFactory(void** _pReturn);
    

    重新写PointClass.h,这时不需要将其声明为导出类,而是继承了接口,使用时可以只公开接口的头文件即可

    #pragma once
    #include "IPoint.h"
    class Point:public IPoint
    {
    public:
    	Point();
    	Point(double x,double y);
    	~Point();
    	double getX();
    	double getY();
    	void setX(double _x);
    	void setY(double _y);
    	double x, y;
    	double distToOrg();
    };
    

    源文件内容

    #include<math.h>
    #include "pointClass.h"
    
    Point::Point()
    {
    	x = 0;
    	y = 0;
    }
    Point::Point(double x, double y)
    {
    	this->x = x;
    	this->y = y;
    }
    Point::~Point()
    {
    
    }
    double Point::getX()
    {
    	return x;
    }
    double Point::getY()
    {
    	return y;
    }
    void Point::setX(double _x)
    {
    	x = _x;
    }
    void Point::setY(double _y)
    {
    	y = _y;
    }
    double Point::distToOrg()
    {
    	return pow(x * x + y * y, 0.5);
    }
    
    int _declspec(dllexport)_stdcall pointFactory(void** _pReturn)
    {
    	Point* pPoint = new Point;
    	*_pReturn = (void*)pPoint;
    	if (pPoint == NULL) return 0;
    	return 1;
    }
    

    pointFactory函数是为了创建一个Point对象,因为接口是虚类,不能直接生成接口对象,这里用pointFactory函数创建一个Point对象将其地址返回给接口的指针,使用接口时main函数如下:

    #include <stdlib.h>
    #include <time.h>
    #include<iostream>
    #include "IPoint.h"
    using namespace std;
    int main()
    {
    	//采用接口
    	srand((unsigned)time(0));
    	double x = rand();
    	double y = rand();
    	IPoint* pt;
    	if (pointFactory((void**)&pt))
    	{
    		pt->setX(x);
    		pt->setY(y);
    		cout << "point coord x=" << pt->getX() << " y=" << pt->getY() << " distToOrg=" << pt->distToOrg() << endl;
    		system("break");
    	}
    }
    

    这中情况下,只需要公开接口头文件即可,编译执行效果如下:
    在这里插入图片描述

    展开全文
  • linux C++ 共享库导出类

    2021-05-16 11:47:27
    1.共享库的对外接口函数的声明必须加上extern “C”。2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。以下是一个插件式设计的示例:1、主...

    1.共享库的对外接口函数的声明必须加上extern “C”。

    2.使用共享库对话接口函数生成的对象指针时在该对象未被释放之前不能关闭共享库句柄,否则会出现segmentation fault错误。

    以下是一个插件式设计的示例:

    1、主执行程序:main.cpp

    #include

    #include

    #include "SMSGamePlugin.h"

    int main(int argc, char** argv)

    {

    void *GameLib = dlopen("./Flower.so", RTLD_LAZY);

    const char *dlError = dlerror();

    if (dlError)

    {

    < "dlopen error!" << dlError <<

    return(-1);

    }

    CSMSGamePlugin *(*pGetGameObject)(void);

    pGetGameObject = (CSMSGamePlugin *(*)(void))dlsym(GameLib, "GetGameObject");

    dlError = dlerror();

    if (dlError)

    {

    < "dlsym error!" << dlError <<

    return(-1);

    }

    CSMSGamePlugin *pGame = (*pGetGameObject)();

    pGame->Initialize();

    pGame->Load();

    pGame->Handle();

    delete *pGame;

    dlclose(GameLib);

    }

    2、公用基类部分:SMSGamePlugin.h

    #ifndef __SMSGamePlugin_h__

    #define __SMSGamePlugin_h

    class CSMSGamePlugin

    {

    public:

    virtual int Initialize(void) = 0;

    virtual int Load(void) = 0;

    virtual int Handle(void) = 0;

    };

    #endif

    编译:g++ -rdynamic -ldl -s -o Test main.cpp

    3、共享库部分:

    共享库头文件:Flower.h

    #ifndef __Flower_h__

    #define __Flower_h__

    #include "SMSGamePlugin.h"

    extern "C" CSMSGamePlugin *GetGameObject(void);

    class CFlower: public CSMSGamePlugin

    {

    public:

    virtual int Initialize(void);

    virtual int Load(void);

    virtual int Handle(void);

    };

    #endif

    4、共享库实现文件:Flower.cpp

    #include

    #include "Flower.h"

    CSMSGamePlugin *GetGameObject(void)

    {

    return(new CFlower());

    }

    int CFlower::Initialize(void)

    {

    < "Initialize()" <<

    return(0);

    }

    int CFlower::Load(void)

    {

    < "Load()" <<

    return(0);

    }

    int CFlower::Handle(void)

    {

    < "Handle()" <<

    return(0);

    }

    编译:

    g++ -c Flower.cpp

    g++ -shared -o Flower.so

    以上没有验证,需要验证之后才可以使用

    展开全文
  • 静态库包含和函数动态库中dll和全局方法是全局的 中的方法非静态的要生成对象才能访问静态库1、函数导出//文件:lib.h#ifndef LIB_H#define LIB_Hextern "C" int add(int x,int y); //声明为C编译、连接方式...

    静态库包含类和函数

    动态库中dll类和全局方法是全局的 类中的方法非静态的要生成对象才能访问

    静态库

    1、函数导出

    //文件:lib.h

    #ifndef LIB_H

    #define LIB_H

    extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数

    #endif

    //文件:lib.cpp

    #include "lib.h"

    int add(int x,int y)

    {

    return x + y;

    }也可以作为类的静态方法用类名访问

    2、导数类

    h文件

    /**************************************************

    Class LuWindowlib

    Function :

    MainWndProc

    ResigterWindow

    CreateWindow

    ***************************************************/

    namespace LuWindowlib

    {

    class LWindow

    {

    private:

    static LRESULT CALLBACK MainWndProc(HWND WindowHandle,UINT Message,WPARAM WParam,LPARAM LParam);

    BOOL LRegisterWindow(HINSTANCE InstanceHandle, HINSTANCE PrevInstanceHandle);

    public:

    long double LCreateWindow(void);

    };

    }

    动态链接库

    1、导出函数

    新建“win32项目”,在“应用程序设置”中选择lib。新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下:

    //文件:lib.h

    #ifndef LIB_H

    #define LIB_H

    extern "C" int add(int x,int y);   //声明为C编译、连接方式的外部函数

    #endif

    //文件:lib.cpp

    #include "lib.h"

    int add(int x,int y)

    {

    return x + y;

    }

    编译后,会生成dll和lib两个文件,下面看如何使用。源码如下:

    #include

    #include "..\lib.h"

    #pragma comment( lib, "..\\debug\\libTest.lib" )  //指定与静态库一起连接

    int main(int argc, char* argv[])

    {

    printf( "2 + 3 = %d", add( 2, 3 ) );

    }

    2、导出函数

    新建“win32项目”,在“应用程序设置”中选择dll。新建commendll.h和commendll.cpp两个文件。commendll.h中

    namespace CommenDLL

    {

    class MathFun

    {

    public:

    static __declspec(dllexport)double Add(double a, double b);

    static __declspec(dllexport)double Minus(double a, double b);

    };

    }

    commendll.cpp中

    namespace CommenDLL

    {

    double MathFun::Add(double a, double b)

    {

    return a+b;

    }

    double MathFun::Minus(double a, double b)

    {

    return a-b;

    }

    }

    3、导出类

    在同上个工程的头文件中

    class __declspec(dllexport) Circle

    {

    public:

    Circle(){};

    ~Circle(){};

    void SetCenter(Point point);

    void SetRadius(int r);

    double GetZhouChang();

    double GetMianJi();

    private:

    Point center;

    int radius;

    };

    CPP文件中

    void Circle::SetCenter(Point point)

    {

    this->center.x = point.x;

    this->center.y = point.y;

    }

    void Circle::SetRadius(int r)

    {

    this->radius = r;

    }

    double Circle::GetZhouChang()

    {

    const double pi = 3.1415926;

    return this->radius*pi*2;

    }

    double Circle::GetMianJi()

    {

    const double pi = 3.1415926;

    return pi*this->radius*this->radius;

    }

    调用的时候,导入生成的库,直接使用其函数或者类即可。

    展开全文
  • C++导入、导出类

    2021-10-02 02:19:48
    #ifdef DLL_EXPORTS #define SIMPLE_CLASS_EXPORT __...使用了(dllexport)关键字,相当于声明了紧接在(dllexport)...https://blog.csdn.net/huangyimo/article/details/81748939dllexport导出类,dllimport导入类。
    展开全文
  • 验证内容:以命名空间的方式导出类,导出函数带参数/不带参数的函数。 1、导出变量 导出的动态库本身需要提供头文件,在命名空间中直接定义变量即可。 #ifndef COMMON_LIB_H #define COMMON_LIB_H #include ...
  • 然而关于c++导出,当我们导出类时,一个类除了构造和析构函数还会导出拷贝函数,并且会将类中的所有函数一一导出,且符号为带修饰符的符号名 但是由于c++导出修饰符号的规则各有不同,因此需要保证dll编程和使用者...
  • 如何在eclipse中直接导出类图和时序图: 1.安装GEF 1)主菜单help->install new software 2)在弹出的对话框中点击add 3)在新弹出的窗口Name:gef Location:...
  • JNA调用C++动态库导出函数导出类 文章目录JNA调用C++动态库导出函数导出类前言一、JNA是什么?二、使用步骤1.编写C++动态库2.JAVA代码编写总结 前言 最近项目需要使用JAVA调用C++动态库导出函数,记录一下大致步骤...
  • 听说Enterprise Architect能画出UML图后导出Java代码,那我最熟悉的StarUML能吗?答案是肯定的!但是需要下载插件来解决这个问题。 方法一:在StarUML软件中对插件进行安装 这个方法当然是最直接的,在软件中的...
  • DLL导出类

    2021-11-16 15:37:39
    dll导出类
  • //+----------------------------------------------------------------------// | 基于ThinkPHP5的数据库表导入导出类// +----------------------------------------------------------------------// | 当前版本:...
  • } } }/***@paramlist 数据源 *@paramfieldMap 的英文属性和Excel中的中文列名的对应关系 *@paramresponse 使用response可以导出到浏览器 *@throwsException * @MethodName : listToExcel * @Description : 导出...
  • 先按从基类到导出类的顺序初始化静态域(之前已经初始化过的静态域不再初始化)再按从基类到导出类的顺序初始化类,即基类普通字段+基类构造器主体+导出类字段+导出类主体...package test;class PrintInfo{static ...
  • 在学习完php jpgraph安装与使用教程后,我来介绍下php导出excelphp excelreader2.21,php excelreader2.21是一个专门用来导出(读取)excel文件内容的php导出excel,学会使用php导出excel文件也会为今后统计数据时...
  • 再来说说dll导出类。 一般只要类前面加上 _API就行了,但是,这里容易出问题,出来一个叫dll hell,就是dll地狱问题。这个问题的现象就是,你改动了这个dll,如果app没有重新编译容易崩溃! ...
  • export default class API {//导出 需要加一个static修饰符 static getUserList() { console.log(11111) } } 引入使用 import API from '文件路径'; async getUserList() { hugeAPI.getUserList(); },
  • Qt使用导出类报错:error C2491: “LmcThreadPaddle::staticMetaObject”: 不允许 dllimport 静态数据成员 的定义 在使用继承自QObject带有Q_OBJECT宏的导出类时,编译报错:不允许 dllimport 静态数据成员 的定义...
  • C++ 类导出及其显式调用 1. 概述 本文介绍一种利用C++面向对象的继承特性与多态特性对进行导出为动态链接库DLL及显式调用,该种导出方法可以减少在调用时对头文件的依赖,更好地隐藏信息。本文由两部分组成,即...
  • 基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这样做是有意义的,因为构造器具有一项特殊任务:检查对象是否被正确地构造。导出类只能访问它自己...
  • idea导出单个的jar包

    2021-03-17 22:18:37
    第一步,创建一个空的目录 第二步修改Jar包名字,增加jar包包名,指定MANIFEST.MF,注意MANIFEST.MF的目录不要在src下,否则会“出现XXX中没有主清单属性” 第三步,选择.class文件 第四步,指定main class入口,...
  • 以下为原始数据表: arcgis导出表.png 统计汇总表: 成果汇总表.png 可以从汇总表中看到,统计分两个维度,一个是根据项目及镇、村来统计各地的总面积,还有一个维度是统计该区域内各地的总面积。 高效统计法...
  • idea中将单个java类导出为jar包文件的方法发布时间:2020-08-31 01:04:04来源:脚本之家阅读:167作者:等你归去来前言idea作为一个java开发的便利IDE工具,个人是比较喜欢的,今天来探索个小功能: 导出单个文件...
  • 用DEF从DLL导出一个函数,或用__declspec(dllexport)指令从DLL中导出,想必大家已经很熟悉了,也经常使用着。这里向大家介绍一种用DEF文件从DLL导出一个的方法。具体原理或为什么就不废话了,学会导出后,再...
  • 1.1 文档注释导出帮助文档在eclipse使用时,可以配合文档注释,导出的说明文档,从而供其他人阅读学习与使用。通过使用文档注释,将或者方法进行注释用@简单标注基本信息。如@author 作者、@version代码版本、...
  • Java将List装载的数据导入与导出文档 首先定义一个学生 public class Student { private String num; private String name; private String score; public Student(String num, String name, String score)...
  • 使用easypoi导出excel以注解的方式添加自增序号,无须改造
  • 简单通用导出类(结合spring) @Slf4j @Component public class ExcelUtils { public void setResponse(HttpServletResponse response, String fileName) { try { fileName = fileName + DateUtil.today() + ".xlsx...
  • 在php编程中,如果要将查询结果导出到Excel,只需对页面的Context-Type做修改即可。例如:复制代码 代码示例:header("Content-Type: application/vnd.ms-excel")如果希望能够提供那个打开/保存的对话框,Content-...
  • 在我看来,在TS中导出和导入引用是合适的,但输出不是我可以使用的.这里肯定存在知识差距,但我不确定我在寻找什么. 解决方法: 如果您不打算使用模块系统(例如requirejs),那么您不需要导入但使用///“...”/> 例如: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 364,455
精华内容 145,782
关键字:

导出类