Установить ссылку на абстрактный класс по списку инициализации - PullRequest
0 голосов
/ 24 сентября 2019

Мне нужно вызвать объект класса, который инициализирует интерфейс по ссылке, проблема в том, что объект нужен во время выполнения, но еще не существует.

Я попытался установить его в качестве constexpr, чтобы объект создавался во время компиляции, но это, похоже, не работает.Класс называется ltdc, и объект должен вызывать конструктор, например.ltdcObject (Ltdc ())

class Ltdc : public ILtdc
{
      public:
        constexpr Ltdc() noexcept {}
};


///////////////////////////////////////

class ILtdc
{
    protected:

    constexpr ILtdc() { }       

    public:

    virtual ~ILtdc() {}
};
///////////////////////////////////////

class Ili9341 final
{
  public:

  Ili9341() noexcept;

  ILtdc & ltdc; //Interface Ltdc Reference
};


///////////////////////////////////////

Ili9341:: Ili9341() noexcept : 

    ltdc(Ltdc()) //this is where it's called in the cpp file

{ }

ошибка: # 461 начальное значение non-const должно быть lvalue

1 Ответ

0 голосов
/ 24 сентября 2019

Вместо создания ссылки на существующий объект вы можете создать сам объект внутри Ili9341:

Изменить

ILtdc & ltdc;

в Ili9341 на

Ltdc ltdc;

И удалите временный объект Ltdc() из инициализатора:

Ili9341:: Ili9341() noexcept : 
    ltdc()
{ }

Если вы не хотите делать элемент ltdc общедоступным внутри Ili9341, вы можете сделать это private и добавьте публичную функцию get, такую ​​как

ILtdc & getLtdc(void);

, возвращающую ссылку на ltdc.

...