我正在编写一个带有组件虚拟类的程序,该虚拟类详细描述了需要通过总线访问设备上的寄存器的组件的行为。寄存器上的各种操作在虚拟类中描述,这与所使用的总线类型无关。派生的RegisterI 2C类实现I2C总线的寄存器访问功能。RegisterI 2C类对应于使用I2C的组件的使用在这个类中,我尝试定义component_reg函数,它调用RegisterI 2C类的构造函数,但在编译时我得到以下错误:
非常量引用的初始值必须是左值C/C++(461)。
我尝试过不同类型的铸造,但还没有找到解决方案。所以我会很感激,如果有人有一个想法:)
class Component;
class Register { // defines access method to registers
public:
Register(Component *parent, int reg) : parent_(parent), register_(reg) {}
virtual int read() = 0; // read the register
Component *const parent_; // parent component
int register_; // the register to operate on
};
class Component { // defines what a component do.Uses Register functions
virtual Register &component_reg(int reg) = 0; // return a Register we use for op on comp
};
class I2C {}; // provides I2C busfunctions
class ComponentI2C;
class RegisterI2C : public Register { // implement Register func for I2C bus
public:
RegisterI2C(Component *parent, int reg) : Register(parent, reg) {}
/* use I2C class methods through downcasting Component to ComponentI2C */
int read() override { return 0; }
};
class ComponentI2C : public Component, public I2C {
public:
RegisterI2C &component_reg(int reg) override { return {this, reg}; }; // **PROBLEM HERE**
};
字符串
注意:将component_reg作为指针返回不是一个选项:(
2条答案
按热度按时间gab6jxml1#
ComponentI2C::component_reg()
返回了一个对 temporaryRegisterI2C
对象的引用。不要这样做。在ComponentI2
内部decompose一个类型为RegisterI2C
的数据成员,然后返回对该成员的引用。字符串
9nvpjoqh2#
我找到的解决方案是:
字符串
注意你应该注意在使用后删除指针