在dll中定义一个类T,怎么把+-/等运算符利用友元函数重载
在dll中定义一个类T,如何把+-*/等运算符利用友元函数重载?
在DLL中定义一个类T,在T中需要重载+-*/等运算符,进行计算,如果定义为内部函数,在进行如T+10类似的计算时,可以,但计算10+T却报错,如果把+-*/定义为友元函数,即可以。但是我在dll中却报错,无法定义。def文件中这样定义的:operator + @1。请问在dll中如何定义+-*/等运算符呢?
------解决方案--------------------
DllForClass.h
结果:
7+i9
在DLL中定义一个类T,在T中需要重载+-*/等运算符,进行计算,如果定义为内部函数,在进行如T+10类似的计算时,可以,但计算10+T却报错,如果把+-*/定义为友元函数,即可以。但是我在dll中却报错,无法定义。def文件中这样定义的:operator + @1。请问在dll中如何定义+-*/等运算符呢?
------解决方案--------------------
DllForClass.h
/ 下列 ifdef 块是创建使从 DLL 导出更简单的DllForClass.cpp
// 宏的标准方法。此 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 : 定义 DLL 应用程序的导出函数。TestDllForClass.cpp
//
#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 : 定义控制台应用程序的入口点。
//
#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