Инициализировать члены базового класса из другого базового класса - PullRequest
0 голосов
/ 13 июля 2020

Я попытался разбить структуру данных на несколько базовых классов, чтобы повторно использовать код и элементы данных. Там я столкнулся с проблемой, что это значительно упростило бы мой код, если бы я мог инициализировать члены одного базового класса членами другого.

struct Base1
{
  const int a;
  Base1() : a(3) {}
};

struct Base2
{
  const int b;
  Base2() : b(a*2) {}
};

struct Derived :
  Base1,
  Base2
{  
  Derived() : Base1(), Base2() {}
};

Так как это невозможно, я ищу способ добиться чего-то подобного, изменив как можно меньше классов Base1 и Base2. Как я мог это сделать?

1 Ответ

2 голосов
/ 13 июля 2020

Вам понадобится чистый интерфейс. Поскольку Base2 никоим образом не связан с Base1 в вашем примере, зависимость, которую вы описываете, должна быть частью его интерфейса с внешним миром. Это не деталь реализации.

Таким образом, правильным решением было бы предоставить явный (я не имею в виду ключевое слово) конструктор:

Base2(int a) : b(a*2) {}

Для Derived вы тогда get:

Derived() : Base1(), Base2(a) {}

Обратите внимание, что Base1 инициализируется до Base2, и поэтому a уже доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...