C ++ - 如何调用用户定义的运算符?

时间:2011-02-27 01:15:41

标签: c++

我看到了以下代码段:

class WindowHandle {
public:
  WindowHandle(WINDOW_HANDLE handle) : w(handle) {}
  ~WindowHandle() { destoryWindow(w); }

  operator WINDOW_HANDLE() { return w; }
  ...

private:
  WINDOW_HANDLE w;
  ...
}

这是一个问题:如何使用运算符WINDOW_HANDLE()来获取原始指针?我按如下方式列出我的猜测:

WindowHandle win(createWindow());

WINDOW_HANDLE winPtr = win.operator WINDOW_HANDLE(); // I am not sure whether this is correct.

谢谢

3 个答案:

答案 0 :(得分:6)

简单地

WINDOW_HANDLE winPtr = win;

就足够了。用户定义的运算符创建隐式转换。

答案 1 :(得分:3)

它允许你施放:

WINDOW_HANDLE winPtr = static_cast<WINDOW_HANDLE>(win);

答案 2 :(得分:0)

您要显示的代码的目的是自动关闭句柄。因此,您进行一次创建WINDOW_HANDLE的调用,然后将其放入包装类中,该类将为您关闭它。

主要问题是它有一个隐式构造函数,没有重载的复制构造函数或赋值运算符,它的析构函数会破坏句柄。

因此,你很可能会遇到麻烦。

运营商WINDOW_HANDLE(这是合法的,ThiefMaster,它是一种隐式转换)的目的是允许用户将WindowHandle传递给实际需要WINDOW_HANDLE的函数。转换应该是const方法。 (毕竟,它没有通过参考)。

虽然该语言已经为您提供了这样的功能,但最好不要使用它。最好使用get()方法。

没有必要编写这样的代码,因为你可以使用boost::unique_ptr来实现这个目的,如果你不需要它可以复制和boost :: shared_ptr,如果你这样做,并且在任何一种情况下你用它创建它删除函数,在本例中为DestroyWindow