感谢大家的支持(对我的批评也是支持!!毕竟我还没达到很高的层次)
to:清风雨
请恕我愚钝,没看懂你要表达的意思
operator int( void ) const 这么做的目的是什么?
to:周星星,Diviner
感谢你们提供新的方法,其实我对stl不熟悉,也几乎没什么时间去研究,只是使用而已.
to:hpho
感谢提供另一个方法,虽然我没试过,但我想应该没问题吧
你得建议还真的不错,当时我写的时候没考虑那么多
class __LGLIB__ lg_GUID:pulbic GUID 已加
this==&id已加
friend ostream& operator<<(ostream &os,const lg_GUID &id);已加
重载为友员方式?左操作数是该类类型的对象时才会考虑使用作为类成员的重载操作符,我这个左操作类必须是这个类的对象,所以好像没有必要吧。
现在这个帖子的名应该改为:如何在MAP中使用GUID了,呵呵,等有时间我整理一下:)
起源:
前一阵子要用map,可是map竟然不能直接用GUID ,例如 typedef map<GUID,classname *> MyMap这样竟然编译出错,我郁闷啊,又找不到原因,一怒之下就写了这个GUID类,一个对象要让map使用有一些条件的,比如要重载些操作符等等,这个类也是经过坛子里的人指点,包括阿荣等,这里表示感谢。
////////////////////////////////////////////////H///////////////////////////////////////////////////////////////
#ifndef LGLIB_GUID_H
#define LGLIB_GUID_H
#include <iostream>
using namespace std;
namespace lglib
{
#ifndef GUIDMODE
#define GUIDMODE
#endif
//COM 环境初始化
class __LGLIB__ lg_ComEnv
{
public:
lg_ComEnv(){::CoInitialize(NULL);}
~lg_ComEnv(){::CoUninitialize();}
};
//定义这个类的原因:原来在map中直接使用GUID总是报错
//所以自己定义了一个GUID类,在类中重载了一些操作符
//GUID定义
#define GUID_64(x,y,z) \
( ( ( uint64 ) x << 32 ) | ( ( uint64 ) ( y << 16 ) | ( uint64 ) z ) )
class __LGLIB__ lg_GUID : public GUID
{
public:
lg_GUID();
lg_GUID(const GUID& id);
lg_GUID(const lg_GUID& id);
~lg_GUID();
void Change();
inline bool operator<(const lg_GUID& id) const
{
uint64 left = GUID_64(Data1,Data2,Data3);
uint64 right = GUID_64(id.Data1,id.Data2,id.Data3);
if(left < right)
return true;
return false;
}
inline void operator=(const lg_GUID& id)
{
Data1 = id.Data1;
Data2 = id.Data2;
Data3 = id.Data3;
memcpy(Data4,id.Data4,sizeof(Data4));
}
inline void operator=(const GUID& id)
{
Data1 = id.Data1;
Data2 = id.Data2;
Data3 = id.Data3;
memcpy(Data4,id.Data4,sizeof(Data4));
}
inline bool operator==(const GUID& id) const
{
if(Data1 == id.Data1&& Data2 == id.Data2&&
Data3 == id.Data3&&memcmp(Data4,id.Data4,sizeof(Data4)) ==0 )
return true;
return false;
}
void print(OutputType type = Output_Console);
inline bool operator==(const lg_GUID& id) const
{
if(this == &id)
return true;
if(Data1 == id.Data1&& Data2 == id.Data2&&
Data3 == id.Data3&&memcmp(Data4,id.Data4,sizeof(id.Data4)) ==0 )
return true;
return false;
}
friend ostream& operator<<(ostream &os,const lg_GUID &id);
};
}
#endif
//////////////////////////////////////////////////////////////CPP///////////////////////////////////////////////////////////
#include "stdafx.h"
#include "lg_guid.h"
namespace lglib
{
static lg_ComEnv __ComEnv;
lg_GUID::lg_GUID()
{
Change();
}
lg_GUID::lg_GUID(const GUID& id)
{
*this = id;
}
lg_GUID::lg_GUID(const lg_GUID& id)
{
*this = id;
}
lg_GUID::~lg_GUID(){}
void lg_GUID::Change()
{
GUID id;
::CoCreateGuid(&id);
*this = id;
}
void lg_GUID::print(OutputType type)
{
LGTRACE(type,"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
Data1, Data2, Data3,
Data4[0], Data4[1], Data4[2], Data4[3],
Data4[4], Data4[5], Data4[6], Data4[7]);
}
ostream& operator<<(ostream &os,const lg_GUID &id)
{
char chOut[40];
sprintf(chOut,"{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
id.Data1, id.Data2, id.Data3,
id.Data4[0], id.Data4[1], id.Data4[2], id.Data4[3],
id.Data4[4], id.Data4[5], id.Data4[6], id.Data4[7]);
os<<chOut<<endl;
return os;
}
}