2012-04-08 55 views
0

我有一个类,其唯一的数据成员是一个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。

我需要创建什么转换函数才能正常工作?

+0

回复:“但我希望它也能够隐式转换为32位无符号整数。”小心你要求的东西。隐式转换会让你在最后期望的时候遇到困难,而有经验的C++程序员通常会避免允许在类中进行隐式转换,除非在少数情况下。通过允许类“A”的这种隐式转换,您认为您会获得什么好处? – 2012-04-08 03:48:22

+0

@Insilico:更清晰的代码,因为当我对位执行操作时,我无需在任何地方写剧集。 – Cam 2012-04-08 03:49:50

+0

使用公共方法或运算符重载来实现这些位操作是不够的? – 2012-04-08 03:51:01

回答

3

声明转换操作符常量:

operator unsigned int() const { return bits; } 

警告:隐式转换运营商几乎总是一个坏主意。危险通常远大于调用一个普通的老成员函数的小麻烦:

unsigned int asInt() const { return bits; } 
⋮ 
unsigned int i = a.asInt(); 

的最终解决方案,如果你有C++ 11,正在申报的明确转换操作符:

explicit operator unsigned int() const { return bits; } 
⋮ 
unsigned int i = static_cast<int>(a); 
+1

谢谢!说得通。我会在时限后接受你的回答,但是你能否详细说明为什么这么危险? – Cam 2012-04-08 03:52:10

+0

关于显式转换运算符 - 非常酷,但如果我这样做,我必须每次在A对象上使用unsigned int运算符之一时调用'static_cast',我宁愿不这样做。您能否详细了解在这种情况下允许这种隐式转换的危险性? – Cam 2012-04-08 03:56:27

+0

@Cam:它不是令人难以置信的危险,只是简单的香草危险,而另一种方式就是这样一个小的拼版,它通常不值得冒险。你不应该为了方便而从事安全交易。 – 2012-04-08 03:57:09