在dll中定义一个类T,如何把+-*/等运算符利用友元函数重载?

zxphxh 2013-10-15 08:01:46
在DLL中定义一个类T,在T中需要重载+-*/等运算符,进行计算,如果定义为内部函数,在进行如T+10类似的计算时,可以,但计算10+T却报错,如果把+-*/定义为友元函数,即可以。但是我在dll中却报错,无法定义。def文件中这样定义的:operator + @1。请问在dll中如何定义+-*/等运算符呢?
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxphxh 2013-10-20
  • 打赏
  • 举报
回复
非常感谢lm_whales!
lm_whales 2013-10-17
  • 打赏
  • 举报
回复
DllForClass.h
/ 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLLFORCLASS_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DLLFORCLASS_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DLLFORCLASS_EXPORTS
#define DLLFORCLASS_API __declspec(dllexport)
#else
#define DLLFORCLASS_API __declspec(dllimport)
#endif

// 此类是从 DllForClass.dll 导出的
class DLLFORCLASS_API CDllForClass {
	double re,im;

public:
	CDllForClass(void);
	CDllForClass(double r);
	CDllForClass(double r,double i);
	CDllForClass(const CDllForClass& a);
	
	double image();
	double real();
	
	CDllForClass operator =(double a);
	CDllForClass operator =(const CDllForClass& a);
	CDllForClass operator +=(double a);
	CDllForClass operator +=(const CDllForClass& a);

	friend DLLFORCLASS_API CDllForClass operator +(const CDllForClass& a,const CDllForClass& b);
	friend DLLFORCLASS_API CDllForClass operator +(const CDllForClass& a,double b);
	friend DLLFORCLASS_API CDllForClass operator +(double a,const CDllForClass& b);
};

extern DLLFORCLASS_API int nDllForClass;

DLLFORCLASS_API int fnDllForClass(void);
DllForClass.cpp
// DllForClass.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "DllForClass.h"


// 这是导出变量的一个示例
DLLFORCLASS_API int nDllForClass=0;

// 这是导出函数的一个示例。
DLLFORCLASS_API int fnDllForClass(void)
{
	return 42;
}

// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 DllForClass.h
CDllForClass::CDllForClass():re(0),im(0){}
CDllForClass::CDllForClass(double r):re(r),im(0){}
CDllForClass::CDllForClass(double r,double i):re(r),im(i){}
CDllForClass::CDllForClass(const CDllForClass& a):re(a.re),im(a.im){}

DLLFORCLASS_API CDllForClass operator +(const CDllForClass& a,const CDllForClass& b){
      return CDllForClass(a) += (b);  
};
DLLFORCLASS_API CDllForClass operator +(const CDllForClass& a,double b){
      return CDllForClass(a) += b;  
};
DLLFORCLASS_API CDllForClass operator +(double a,const CDllForClass& b){
      return CDllForClass(b) += a;  
};

double CDllForClass::image(){return im;}
double CDllForClass::real(){return re;}
		
CDllForClass CDllForClass::operator =(double a){ re = a;im=0; return *this; }
CDllForClass CDllForClass::operator =(const CDllForClass& a){ re = a.re;im=a.im; return *this; }
CDllForClass CDllForClass::operator +=(double a){ re += a; return *this; };
CDllForClass CDllForClass::operator +=(const CDllForClass& a){ re += a.re;im += a.im; return *this; }
TestDllForClass.cpp
// TestDllForClass.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include"DllForClass.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{   CDllForClass c,c1(4,5),c2(3,4.0);
    c =c1+c2;
	cout<<c.real();
	if(c.image()>=0)cout<< "+" ;else cout<<"-" ;
	cout<< "i" <<abs(c.image())<<endl;
	cin.get();
	return 0;
}
结果: 7+i9
lm_whales 2013-10-16
  • 打赏
  • 举报
回复
1)同一个编译器,中的类可以直接导出,比如VC 2)导出类的某些函数,在使用DLL的时候通过代理类 导出 代理类存储指针,并重定义 重载+-*/等运算符 这些运算符调用被代理的类的运算符。
zxphxh 2013-10-16
  • 打赏
  • 举报
回复
引用 1 楼 lm_whales 的回复:
用代理类吧。
能否详细说一说吗?
lm_whales 2013-10-16
  • 打赏
  • 举报
回复
用代理类吧。
Visual C++ 2005入门经典.pdf(整理并添加所有书签) ,看书的时候更方便. 封面 目录 第1章 使用Visual C++ 2005 编程 1.1 .NET Framework 1.2 CLR 1.3 编写C++应用程序 1.4 学习windows编程 1.4.1 学习c++ 1.4.2 C++标准 1.4.3 控制台应用程序 1.4.4 Windows编程概念 1.5 集成开发环境简介 1.6 使用IDE 1.6.1 工具栏选项 1.6.2 可停靠的工具栏 1.6.3 文档 1.6.4 项目和解决方案 1.6.5 设置Visual C++2005的选项 1.6.6 创建和执行windows应用程序 1.6.7 创建windows Forms应用程序 1.7 小结 第2章 数据、变量和计算 2.1 C++程序结构 2.1.1 程序注释 2.1.2 #include指令——头文件 2.1.3 命名空间和using声明 2.1.4 main()函数 2.1.5 程序语句 2.1.6 空白 2.1.7 语句块 2.1.8 自动生成的控制台程序 2.2 定义变量 2.2.1 命名变量 2.2.2 C++的关键字 2.2.3 声明变量 2.2.4 变量的初值 2.3 基本数据型 2.3.1 整型变量 2.3.2 字符数据型 2.3.3 整型修饰符 2.3.4 布尔型 2.3.5 浮点型 2.3.6 ISO/ANSI C++的基本型 2.3.7 字面值 2.3.8 定义数据型的同义词 2.3.9 具有特定值集的变量 2.3.10 指定枚举常量的型 2.4 基本的输入输出操作 2.4.1 从键盘输入 2.4.2 到命令行的输出 2.4.3 格式化输出 2.4.4 转义序列 2.5 C++的计算 2.5.1 赋值语句 2.5.2 算术运算 2.5.3 计算余数 2.5.4 修改变量 2.5.5 增量和减量运算符 2.5.6 计算的顺序 2.6 变量型和型强制转换 2.6.1 对操作数进行型强制转换的规则 2.6.2 赋值语句型强制转换 2.6.3 显式型强制转换 2.6.4 老式的型强制转换 2.6.5 按位运算符 2.7 了解存储时间和作用域 2.7.1 自动变量 2.7.2 决定变量声明的位置 2.7.3 全局娈量 2.7.4 静态变量 2.8 命名空间 2.8.1 声明命名空间 2.8.2 多个命名空间 2.9 C++/CLI编程 2.9.1 C++/CLI特有的基本数据型 2.9.2 命令行上的C++/CLI输出 2.9.3 C++/CLI特有的功能——格式化输出 2.9.4 C++/CLI的键盘输入 2.9.5 使用safe cast 2.9.6 C++/CLI枚举 2.10 小结 2.11 练习题 第3章 判断和循环 3.1 比较数据值 3.1.1 if语句 3.1.2 嵌套if语句 3.1.3 扩展的if语句 3.1.4 嵌套的if-else语句 3.1.5 逻辑运算符和表达式 3.1.6 条件运算符 3.1.7 switch语句 3.1.8 无条件转移 3.2 重复执行语句块 3.2.1 循环的概念 3.2.2 for循环的变体 3.2.3 while循环 3.2.4 do-while循环 3.2.5 嵌套的循环 3.3 C++/CLI编程 3.4 小结 3.5 练习 第4章 数组、字符串和指针 4.1 处理多个相同型的数据值 4.1.1 数组 4.1.2 声明数组 4.1.3 初始化数组 4.1.4 字符数组和字符串处理 4.1.5 多维数组 4.2 间接数据存取 4.2.1 指针的概念 4.2.2 声明指针 4.2.3 使用指针 4.2.4 初始化指针 4.2.5 sizeof运算符 4.2.6 常量指针和指向常量的指针 4.2.7指针和数组 4.3 动态内存分配 4.3.1 堆的别名——自由存储器 4.3.2 new和delete运算符 4.3.3 为数组动态分配内存 4.3.4 多维数组的动态分配 4.4 使用引用 4.4.1 引用的概念 4.4.2 声明并初始化引用 4.5 C++/CLI编程 4.5.1 跟踪句柄 4.5.2 CLR数组 4.5.3 字符串 4.5.4 跟踪引用 4.5.5 内部指针 4.6 小结 4.7 练习 第5章 程序结构(1) 5.1 理解函数 5.1.1 需要函数的原因 5.1.2 函数的结构 5.1.3 使用函数 5.2 给函数传递实参 5.2.1 按值传递机制 5.2.2 给函数传递指针实参 5.2.3 给函数传递数组 5.2.4 给函数传递引用实参 5.2.5 使用const修饰符 5.2.6 main()函数的实参 5.2.7 接受数量不定的函数实参 5.3 从函数返回值 5.3.1 返回指针 5.3.2 返回引用 5.3.3 函数的静态变量 5.4 递归函数调用 5.5 C++/CLI编程 5.5.1 接受数量可变实参的函数 5.5.2 main()的实参 5.6 小结 5.7 练习 第6章 程序结构(2) 6.1 函数指针 6.1.1 声明函数指针 6.1.2 函数指针作为实参 6.1.3 函数指针的数组 6.2 初始化函数形参 6.3 异常 6.3.1 抛出异常 6.3.2 捕获异常 6.3.3 MFC的异常处理 6.4 处理内存分配错误 6.5 函数重载 6.5.1 函数重载的概念 6.5.2 何时重载函数 6.6 函数模板 6.7 使用函数的示例 6.7.1 实现计算器 6.7.2 从字符串删除空格 6.7.3 计算表达式的值 6.7.4 获得项值 6.7.5 分析数 6.7.6 整合程序 6.7.7 扩展程序 6.7.8 提取子字符串 6.7.9 运行修改过的程序 6.8 C++/CLI编程 6.8.1 理解函数 6.8.2 CLR版本的计算器程序 6.9 小结 6.10 练习 第7章 自定义数据型 7.1 C++的结构 7.1.1 结构的概念 7.1.2 定义结构 7.1.3 初始化结构 7.1.4 访问结构的成员 7.1.5 伴随结构的智能帮助 7.1.6 RECT结构 7.1.7 使用指针处理结构 7.2 数据型、对象、和实例 7.2.1 的起源 7.2.2 的操作 7.2.3 术语 7.3 理解 7.3.1 定义 7.3.2 声明的对象 7.3.3 访问的数据成员 7.3.4 的成员函数 7.3.5 成员函数定义的位置 7.3.6 内联函数 7.4 构造函数 7.4.1 构造函数的概念 7.4.2 默认的构造函数 7 4.3 在定义指定默认的形参值 7.4.4 在构造函数使用初始化列表 7.5 的私有成员 7.5.1 访问私有成员 7.5.2 友元函数 7.5.3 默认复制构造函数 7.6 this指针 7.7 的const对象 7.7.1 的const成员函数 7.7.2 外部的成员函数定义 7.8 对象的数组 7.9 的静态成员 7.9.1 的静态数据成员 7.9.2 的静态函数成员 7.10 对象的指针和引用 7.10.1 对象的指针 7.10.2 对象的引用 7.11 C++/CLI编程 7.11.1 定义数值型 7.11.2 定义引用型 7.11.3 属性 7.11.4 initonly字段 7.11.5 静态构造函数 7.12 小结 7.13 练习 第8章 深入理解 8.1 的析构函数 8.1.1 析构函数的概念 8.1.2 默认的析构函数 8.1.3 析构函数与动态内存分配 8.2 实现复制构造函数 8.3 在变量之间共享内存 8.3.1 定义联台 8.3.2 匿名联合 8.3.3 和结构的联合 8.4 运算符重载 8.4.1 实现重载运算符 8.4.2 实现对运算符的完全支持 8.4.3 重载赋值运算符 8.4.4 重载加法运算符 8.4.5 重载递增和递减运算符 8.5 模板 8.5.1 定义模板 8.5.2 根据模板创建对象 8.5.3 使用有多个形参的模板 8.6 使用 8.6.1 接口的概念 8.6.2 定义问题 8.6.3 实现CBox 8.6.4 定义CBox 8.6.5 使用CBox 8.7 组织程序代码 8.8 C++/CLI编程 8.8.1 在数值重载运算符 8.8.2 重载递增和递减运算符 8.8.3 在引用重载运算符 8.9 小结 8.1O 练习 第9章 继承和虚函数 9.1 面向对象编程的基本思想 9.2 的继承 9.2.1 基的概念 9.2.2 基的派生 9.3 继承机制下的访问控制 9.3.1 派生构造函数的操作 9.3.2 声明的保护成员 9.3.3 继承成员的访问级别 9.4 派生的复制构造函数 9.5 友元成员 9.5.1 友元 9.5.2 对友元关系的限制 9.6 虚函数 9.6.1 虚函数的概念 9.6.2 使用指向对象的指针 9.6.3 使用引用处理虚函数 9.6.4 纯虚函数 9.6.5 抽象 9.6.6 间接基 9.6.7 虚析构函数 9.7 型之间的强制转换 9.8 嵌套 9.9 C++/CLI编程 9.9.1 C++/CLI的继承 9.9.2 接口 9.9.3 定义接口 9.9.4 和程序集 9.9.5 被指定为new的函数 9.9.6 委托和事件 9.9.7 引用的析构函数和结束函数 9.9.8 通用 9.10 小结 9.11 练习 第10章 调试技术 10.1 理解调试 10.1.1 程序故障 10.1.2 常见故障 10.2 基本的调试操作 10.2.1 设置断点 10.2.2 设置跟踪点 10.2.3 启动调试模式 10.2.4 修改变量的值 10.3 添加调试代码 10.3.1 使用断言 10.3.2 添加自己的调试代码 10.4 调试程序 10.4.1 调用堆栈 10.4.2 单步执行到出错位置 10.5 测试扩展的 10.6 调试动态内存 10.6.1 检查自由存储器的函数 10.6.2 控制自由存储器的调试操作 10.6.3 自由存储器的调试输出 10.7 调试C++/CLI程序 10.8 小结 第11章 Windows编程的概念 11.1 Windows编程基础 11.1.1窗口的元素 11.1.2 Windows程序与操作系统 11.1.3事件驱动型程序 11.1.4 Windows消息 11.1.5 WindowsAPI 11.1.6.Windows数据型 11.1.7 Windows程序的符号 11.2 Windows程序的结构 11.2.1 WinMain()函数 11.2.2消息处理函数 11.2.3简单的Windows程序 11.3 Windows程序的组织 11.4 MFC 11.4.1 MFC标记法 11.4.2 MFC程序的组织方式 11.5使用Windows Forms 11.6小结 第12章 使用MFC编写Windows程序 12.1 MFC的文档,视图概念 12.1.1 文档的概念 12.1.2 文档界面 12.1.3 视图的概念 12.1.4 连接文档和视图 12.1.5 应用程序和MFC 12.2 创建MFC应用程序 12.2.1 创建SDI应用程序 12.2.2 MFCApplicationwizard的输出 12.2.3 创建MDI应用程序 12.3 小结 12.4 练习 第13章 处理菜单和工具栏 13.1 与Windows进行通信 13.1.1 了解消息映射 13.1.2 消息别 13.1.3 处理程序的消息 13.2 扩充Sketcher程序 13.3 菜单的元素 13.4 为菜单消息添加处理程序 13.4.1 选择处理菜单消息的 13.4.2 创建菜单消息函数 13.4.3 编写菜单消息函数的代码 13.4.4 添加更新用户界面的消息处理程序 13.5 添加工具栏按钮 13.5.1 编辑工具栏按钮的属性 13.5.2 练习使用工具栏按钮 13.5.3 添加工具提示 13.6 小结 13.7 练习题 第14章 在窗口绘图 14.1 窗口绘图的基础知识 14.1.1 窗口客户区 14.1.2 Windows图形设备界面 14.2 Visual C++的绘图机制 14.2.1 应用程序的视图 14.2.2 CDC 14.3 实际绘制图形 14.4 对鼠标进行编程 14.4.1 鼠标发出的消息 14.4.2 鼠标消息处理程序 14.4.3 使用鼠标绘图 14.5 练习使用Sketcher程序 14.5.1 运行这个示例 14.5.2 捕获鼠标消息 14.6 小结 14.7 练习题 第15章 创建文档和改进视图 15.1 什么是集合 15.1.1 集合的型 15.1.2 型安全的集合 15.1.3 对象集合 15.1.4 型化指针集合 15.2 使用CList模板 15.2.1 绘制曲线 15.2.2 定义CCurve 15.2.3 实现CCurve 15.2.4 练习使用CCurve 15.3 创建文档 15.4 改进视图 15.4.1 更新多个视图 15.4.2 滚动视图 15.4.3 使用MM_LOENGLISH映射模式 15.5 删除和移动形状 15.6 实现上下文菜单 15.6.1 关联菜单和 15.6.2 选择上下文菜单 15.6.3 醒目显示元素 15.6.4 处理菜单消息 15.7 处理被屏蔽的元素 15.8 小结 15.9 练习 第16章 使用对话框和控件 16.1 理解对话框 16.2 理解控件 16.3 创建对话框资源 16.4 对话框的编程 16.4.1 添加对话框 16.4.2 模态和非模态对话框 16.4.3 显示对话框 16.5 支持对话框控件 16.5.1 初始化控件 16.5.2 处理单选按钮消息 16.6 完成对话框的操作 16.6.1 给文档添加存储线宽的成员 16.6.2 给元素添加线宽 16.6.3 在视图创建元素 16.6.4 练习使用对话框 16.7 使用微调按钮控件 16.7.1 添加Scale菜单项和工具栏按钮 16.7.2 创建微调按钮 16.7.3 生成比例对话框 16.7.4 显示微调按钮 16.8 使用比例系数 16.8.1 可缩放的映射模式 16.8.2 设置文档的大小 16.8.3 设置映射模式 16.8.4 同时实现滚动与缩放 16.9 使用状态栏 16.10 使用列表框 16.10.1 删除比例对话框 16.1O.2 创建列表框控件 16.11 使用编辑框控件 16.11.1 创建编辑框资源 16.11.2 创建对话框 16.11.3 添加Text菜单项 16.11.4 定义文本元素 16.11.5 实现CText 16.11.6 创建文本元素 16.12 小结 16.13 练习 第17章 存储和打印文档 17.1 了解串行化 17.2 串行化文档 17.2.1 文档定义的串行化 17.2.2 丈档实现的串行化 17.2.3 基于CObject的的功能 17.2.4 串行化的工作方式 17.2.5 如何实现的串行化 17.3 应用串行化 17.3.1 记录文档修改 17.3.2 串行化文档 17.3.3 串行化元素 17.4 练习串行化 17.5 移动文本 17.6 打印文档 17.7 实现多页打印 17.7.1 获取文档的总尺寸 17.7.2 存储打印数据 17.7.3 准备打印 17.7.4 打印后的清除 17.7.5 准备设备上下文 17.7.6 打印文档 17.7.7 获得文档的打印输出 17.8 小结 17.9 练习题 第18章 编写自己的DLL 18.1 了解DLL 18.1.1 DLL的工作方式 18.1.2 DLL的内容 18.1.3 DLL变体 18.2 决定放入DLL的内容 18.3 编写DLL 18.3.1 编写和使用扩展DLL 18.3.2 从DLL导出变量和函数 18.3.3 将符号导入程序 18.3.4 实现符号从DLL的导出 18.4 小结 18.5 练习题 第19章 连接到数据源 19.1 数据库基础知识 19.2 SQL 19.2.1 使用SQL检索数据 19.2.2 使用SQL连接表 19.2.3 对记录进行排序 19.3 MFC的数据库支持 19.4 创建数据库应用程序 19.4.1 注册ODBC数据库 19.4.2 生成MFC ODBC程序 19.4.3 了解程序结构 19.4.4 示例练习 19.5 对记录集进行排序 19.6 使用另一个记录集对象 19.6.1 添加记录集 19.6.2 添加记录集的视图 19.6.3 定制记录集 19.6.4 访问多个表视图 19.6.5 查看产品的订单 19.7 查看客户的详细情况 19.7.1 添加客户记录集 19.7.2 创建客户对话框资源 19.7.3 创建客户视图 19.7.4 添加过滤器 19.7.5 实现过滤器参数 19.7.6 链接订单对话框和客户对话框 19.7.7 练习使用数据库查看器 19.8 小结 19.9 练习题 第20章 更新数据源 20.1 更新操作 20.1.1 CRecordset更新操作 20.1.2 事务 20.2 简单的更新示例 20.3 管理更新过程 20.4 向表添加行 20.4.1 订单录入过程 20.4.2 创建资源 20.4.3 创建记录集 20.4.4 创建记录集视图 20.4.5 给对话框资源添加控件 20.4.6 实现对话框切换 20.4.7 创建订单ID 20.4.8 存储订单数据 20.4.9 为订单选择产品 20.4.10 添加新订单 20.5 小结 20.6 练习 第21章 使用Windows Forms的应用程序 21.1 理解Wqndows Forms 21.2 理解Windows Forms应用程序 21.2.1 修改窗体的属性 21.2.2 如何启动应用程序 21.3 定制应用程序GUI 21.3.1 给窗体添加控件 21.3.2 添加选项卡控件 21.3.3 使用CroupBox控件 21.3.4 使用Button控件 21.3.5 使用WebBrowser控件 21.3.6 Winning应用程序的操作 21.3.7 添加上下文菜单 21.3.8 创建事件处理程序 21.3.9 处理Limits菜单的事件 21.3.10 创建对话框 21.3.11 使用对话框 21.3.12 添加第二个对话框 21.3.13 实现Help|About菜单项 21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式使用DataGridView控件 22.5 定制DataGridView控件 22.5.1 定制题头单元格 22.5.2 定制非题头单元格 22.5.3 动态设置单元格样式 22.6 使用约束模式 22.7 BindingSource组件 22.8 使用BindingNavigator控件 22.9 绑定到单独的控件 22.10 使用多个表 22.11 小结 22.12 练习 附录A C++关键字 A1 ISO/ANSI C++关键宇 A2 C++/CLI关键字 附录B ASCII码

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧