如何将远程设备映射为C++中的数组?

问题描述:

我想创建一个C++对象来包装外部外围设备的RAM。我试图设置如下内容:如何将远程设备映射为C++中的数组?

Peripheral p;

p [4] = 10;

int n = p [5];

为此,我需要读写数组元素时访问外设。 我不能解决如何使用操作符重载等操作。我可以返回一个可在第二行中用作左值的“访问器”对象:

PeripheralAccessor Peripheral :: operator [](int i);

或我可以定义可用于读取从所述外围的int在第三行“简单”运算符:

INT外设::操作符[](INT I);

但我不能让这两个共存给予外设的读写访问权限。我可以将第二个运算符定义为一个常量(右值)运算符,但它只会被调用为该类的常量实例,这对于我的需要是不够的...

希望我已经解释了什么我试图在这里清楚地实现;有人可以建议我应该怎么做(或者确实是否有可能)?

通常的方式来处理,这是使用代理对象:

class register_proxy { 
public: 
    register_proxy &operator=(int value) { 
     write_value(value); 
    } 

    operator int() { 
     return read_value(); 
    } 
}; 

class peripheral { 
    register_proxy registers[4]; 
public: 

    register_proxy &operator[](int reg_num) { return registers[reg_num]; } 
}; 

我省略了一些细节(怎么样,你告诉对方register_proxy读什么实际注册号/写 - 通常是由传递一个参数给Ctor)。无论如何,总体思路非常简单:operator[]返回对代理对象的引用。代理对象的operator int(或当然需要的任何类型)在分配的右侧使用时会被调用。在代理对象的operator=位于赋值的左侧时会被调用,因此您正试图在其中写入值。

+0

+1,在写同样的事情。 – 2010-06-28 18:42:11

+0

@尼古拉同样在这里。 – Cogwheel 2010-06-28 18:43:49

+0

辉煌,谢谢。这是事实,你可以这样做: operator int() 我没有解决。 – Jonny 2010-06-28 18:56:26

由于你不能基于返回类型进行重载,所以你必须选择一个或另一个(并且你不能选择int,因为你没有得到左值行为)。但是,您可以将PeripheralAccessor自动转换为int。

编辑:杰里打我。代码均匀。

给你的 “PeripheralAccessor” 的隐式转换操作符INT:

operator int() const;