c++ 非常量引用的初始值必须是ctor中的左值

gxwragnw  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(120)

我正在编写一个带有组件虚拟类的程序,该虚拟类详细描述了需要通过总线访问设备上的寄存器的组件的行为。寄存器上的各种操作在虚拟类中描述,这与所使用的总线类型无关。派生的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作为指针返回不是一个选项:(

gab6jxml

gab6jxml1#

ComponentI2C::component_reg()返回了一个对 temporaryRegisterI2C对象的引用。不要这样做。在ComponentI2内部decompose一个类型为RegisterI2C的数据成员,然后返回对该成员的引用。

class Component;

class Register {
 public:
  Register(Component *parent, int reg) : parent_(parent), register_(reg) {}
  virtual ~Register() = default;
  virtual int read() = 0;
  Component *const parent_;
  int register_;
};

class Component {
  virtual Register& component_reg(int reg) = 0;
};

class I2C {};

class ComponentI2C;

class RegisterI2C : public Register {
 public:
  RegisterI2C(Component *parent, int reg) : Register(parent, reg) {}
  int read() override { return 0; }
};

class ComponentI2C : public Component, public I2C {
  RegisterI2C regI2C_;
 public:
  ComponentI2C() : regI2C_(this, 0) {}
  Register& component_reg(int reg) override { regI2C_.register_ = reg; return regI2C_; };
};

字符串

9nvpjoqh

9nvpjoqh2#

我找到的解决方案是:

public:
  RegisterI2C &component_reg(int reg) override { return *new RegisterI2C(this, reg); };

字符串
注意你应该注意在使用后删除指针

相关问题