回 帖 发 新 帖 刷新版面

主题:如何重载operator实现指针类型隐式转换?

代码如下:

class A
{
public:
    A() {}
    ~A() {}
}
class B
{
public:
    B(void);
    ~B(void);
}

main()
{
    A* pa = NULL;
    B* pb = NULL;
    pa = pb;    //error,无法将 B* 隐式转换成 A* 。
}

main()函数中,“pa=pb”无法通过编译,当然如果改写成“pa=reinterpret_cast<A*>(pb)”进行显式类型转换是可以通过编译的。

不知道是不是可以通过重载operator的方式进行隐式转换?我尝试了如下两种方式,都不行。

方式一:
class A
{
public:
    A() {}
    ~A() {}
public:
    A* operator= (B* pb)
    {
        return ( reinterpret_cast<A*>(pb) );
    }
}

方法二:
class B
{
public:
    B(void);
    ~B(void);
public:
    operator A*()
    {
        return reinterpret_cast<A*>(this);
    }
}

请高手指教一下。

回复列表 (共3个回复)

沙发

方法一不行,因为它是 B* 构造 A
方法二不行,因为它是 B 转化为 A*
你连 T 和 T* 都分不清:)

板凳

不错。楼上对错误的解释很清晰。
那么如何实现 B* 转化为 A* 呢?

或者说,有实现隐式转换的可能吗?
后来仔细想了想:operator重载是针对自定义数据类型才有效的,C++允许我们可以自定义一个T的operator,却无法定义一个T*的operator,因此重载operator的方法似乎走不通。

果真如此的话,有其它的技巧来实现吗?

3 楼

此路不通啊。
除了把一个缓冲区的指针(可能是char*之类)转化为各种类型的指针(比如int*)之外,应该很少有不同类型指针之间的转换了。显式的更显眼一点。
很多人都认为应该尽可能避免隐式转换,比如std::string就不能隐式转换为const char*。

我来回复

您尚未登录,请登录后再回复。点此登录或注册