我有一个类,其唯一的数据成员是一个32位无符号整数。也就是说,类看起来是这样的:从常量用户定义的类转换为C++中的内建类型
class A {
protected:
unsigned int bits;
/* ... some methods ... */
public:
/* ... some methods ... */
};
但我希望它也能隐式转换和从32位无符号整数。所以,我在一个拷贝构造函数增加以及铸造操作:
class A {
protected:
unsigned int bits;
/* ... some methods ... */
public:
A(): bits(0) {} // default constructor
A(const unsigned int i): bits(i) {} // convert from unsigned int to A
operator unsigned int() { return bits; } // convert from A to unsigned int
/* ... some methods ... */
};
所以现在例如,我可以做以下的事情:
int main() {
// default constructor
A a0 = A();
// convert from unsigned int
A a1 = 1 + 2;
// conversions between the two types:
unsigned int result = (a0 & a1 + 5)/2;
}
但是我努力得到它的工作与const
类型。具体而言,以下不工作:
int main() {
const A a = 5; // works
unsigned int i = a; // compiletime error
}
它说:“没有合适的转换函数从‘常量A’到‘无符号整数’存在。”我使用Microsoft提供的默认编译器使用Visual Studio 2010。
我需要创建什么转换函数才能正常工作?
回复:“但我希望它也能够隐式转换为32位无符号整数。”小心你要求的东西。隐式转换会让你在最后期望的时候遇到困难,而有经验的C++程序员通常会避免允许在类中进行隐式转换,除非在少数情况下。通过允许类“A”的这种隐式转换,您认为您会获得什么好处? – 2012-04-08 03:48:22
@Insilico:更清晰的代码,因为当我对位执行操作时,我无需在任何地方写剧集。 – Cam 2012-04-08 03:49:50
使用公共方法或运算符重载来实现这些位操作是不够的? – 2012-04-08 03:51:01