如何将远程设备映射为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=
位于赋值的左侧时会被调用,因此您正试图在其中写入值。
由于你不能基于返回类型进行重载,所以你必须选择一个或另一个(并且你不能选择int,因为你没有得到左值行为)。但是,您可以将PeripheralAccessor自动转换为int。
编辑:杰里打我。代码均匀。
给你的 “PeripheralAccessor” 的隐式转换操作符INT:
operator int() const;
+1,在写同样的事情。 – 2010-06-28 18:42:11
@尼古拉同样在这里。 – Cogwheel 2010-06-28 18:43:49
辉煌,谢谢。这是事实,你可以这样做: operator int() 我没有解决。 – Jonny 2010-06-28 18:56:26