匈牙利命名法和类型系统

匈牙利命名法的原意,可参考:http://blog.youkuaiyun.com/tiewen/article/details/8536773

 

在Windows中,常用cx表示宽度,cy表示高度,它们都是整数。在“阅读”代码时,如果发现cx=cy或cy=cx之类的语句,我们知道它们很可能是个错误。我强调“阅读”二字,是因为,如果不睁大眼睛、详细仔细地审查代码,很难发现cx=cy或cy=cx之类的错误,至少C++编译器可以完美通过。

那么,我们如何避免这样的错,或者至少让编译器告诉我们?

我想不到更好的办法,只能借助C++的类型系统,当发生错误的赋值动作时,让C++编译器吱哩哇啦乱叫。

class CX{};

class CY{};

CX cx;

CY cy;

cx = cy;//如果没有隐式类型转换的话,error!

cy = cx;//如果没有隐式类型转换的话,error!

CX和CY应该能够和整数的行为保持一致,但不能包含任何的隐式类型转换。

class CX

{

public:

explicit CX(int cx):_cx(cx){}

explicit CX(const CX& cx):_cx(cx._cx){}

 

CX& operator++(){...}

 CX operator--(int){...}

......

 

int GetValue() const{return _cx}

void SetValue(int cx){_cx = cx;}

 

private://禁止到int及其兼容类型(long等)的转换

operator int() const;//要么不写,要么仅申明而不实现

operator int&();;//要么不写,要么仅申明而不实现

...

 

private:

int _cx;

};

 

class CY

{

public:

explicit CY(int cy):_cy(cy){}

explicit CY(const CY& cy):_cy(cy._cy){}

 

CY& operator++(){...}

 CY operator--(int){...}

......

 

int GetValue() const{return _cy}

void SetValue(int cy){_cy = cy;}

 

private://禁止到int及其兼容类型(long等)的转换

operator int() const;//要么不写,要么仅申明而不实现

operator int&();;//要么不写,要么仅申明而不实现

...

 

private:

int _cy;

};

 

如果把CX和CY的成员变量的名称统一,则它们除了类型名称不同,其它的完全一样,因此,我们可以使用宏或模板。宏的格式不好看,此处使用模板:

#define TYPEOFCX 1

#define TYPEOFCY 2

template<int TYPE>

class TXAndY

{

public:

explicit TXAndY(int value):_value(value){}

explicit TXAndY(const TXAndY& value):_value(value._value){}

 

TXAndY& operator++(){...}

 TXAndY operator--(int){...}

......

 

int GetValue() const{return _value}

void SetValue(int value){_value = value;}

 

private:

int _value;

};

typedef  TXAndY<TYPEOFCX> CX;

typedef  TXAndY<TYPEOFCY> CY;

 

void CXXXDlg::OnSize(UINT nType, int cx, int cy)

{

......

CX ocx(cx);

CY ocy(cy);

ocx = ocy;//error!如果是有意的赋值,使用ocx.SetValue(ocy.GetValue());或ocx = CX(ocy.GetValue());

ocy = ocx;//error!

ocx = 30;//error!如果是有意的赋值,使用ocx.SetValue(30);或ocx = CX(30);

......

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值