用C ++编写代理类

时间:2017-10-20 11:17:13

标签: c++

我有一个C ++包装类,它将一些硬件提取封装为:

class DeviceWrapper
{
private:
    PhysicalDevice mDevice;
};

有各种类访问设备,并且大多数类接受底层设备作为它们的第一个参数,如下所示:

void someFunc(PhysicalDevice & device);

所以我目前在我的包装类中有以下getter方法:

PhysicalDevice & DeviceWrapper::getPhysicalDevice()
{
    return mDevice;
}

我这样使用它:someFunc(myWrapper.getPhysicalDevice());

然而,这看起来有点麻烦。有没有办法定义某种类型的运算符,它返回对此设备的引用,然后我基本上可以使用对包装类的引用,只要需要引用PhyscialDevice

3 个答案:

答案 0 :(得分:3)

有两种常见的表达方式:

  1. 提供隐式转换:
  2. class DeviceWrapper
    {
        operator PhysicalDevice&() { return mDevice; }
    private:
        PhysicalDevice mDevice;
    };
    

    1. 重新实现该功能作为一种方法(由于另一个答案中提到的原因,我赞成这种方法):
    2. class DeviceWrapper
      {
          auto someFunc() { return ::somefunc(mDevice); }
      
      private:
          PhysicalDevice mDevice;
      };
      

答案 1 :(得分:2)

是的,完全正确!

class DeviceWrapper
{
    // ...
public:
    operator PhysicalDevice &() {
        return mDevice;
    }
};

您已完成:DeviceWrapper现在可以隐式转换为对其PhysicalDevice的引用,例如在期望PhysicalDevice &的函数调用中。

答案 2 :(得分:1)

如果您完全控制API,我会建议强制转换操作符,并建议阻止对底层设备对象的任何访问。

为什么?因为API应该易于使用,但难以滥用。如果允许用户直接和通过代理访问底层对象,则可能导致运行时状态不一致。

而是使用您的代理包装所有API方法,从而管理状态并使其保持一致:

class DeviceWrapper
{
public:
    void someFunc1(PhysicalDevice & device) { ::someFunc1(mDevice); }
    void someFunc2(PhysicalDevice & device) { ::someFunc2(mDevice); }

private:
    PhysicalDevice mDevice;
};