Как определить конструктор копирования для структуры, которая разделяет базовый класс и определяется после определения структуры - PullRequest
1 голос
/ 11 июня 2019

С двумя структурами A и B, которые подклассируют одну и ту же структуру Base, я хочу иметь конструкторы копирования для A и B в структуре A.

Проблема заключается в том, что предварительное объявление B struct B; до определения структуры A является проблемой, поскольку компилятор еще не знает, что B будет создавать подклассы Base.

Возможно ли сделать такое предварительное объявление, например:-

struct B : public Base; // Что не работает, к сожалению

Конструктор копирования в структуре 'A' имеет ошибку

  A(const B& b) : Base{b} {} // Error no matching Base::Base() for const B&.

Вопрос в том, как это сделатьправильное предварительное объявление для структуры B.

struct Base {
  Base(int value) : _value{value} {}
  Base(const Base& base) : _value{base.value()} {}
  int value() const {return _value;}
private:
  const int _value;
};
struct B; // Compiler does not know that B will subclass Base
struct A : public Base {
  A(int value) : Base{value} {}
  A(const A& a) : Base{a} {}
  A(const B& b) : Base{b} {} // Error no matching Base::Base() for const B&.
};
struct B : public Base {
  B(int value) : Base{value} {}
  B(const B& b) : Base{b} {}
  B(const A& a) : Base{a} {}
};
int main() {
  A a1{20};
  A a2{a1};
  cout << "a1: " << a1.value() << " a2: " << a2.value() << endl;
  B b1{10};
  B b2{b1};
  cout << "b1: " << b1.value() << " b2: " << b2.value() << endl;
}

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Удалите определение конструктора A из определения класса, чтобы вы могли определить B перед его использованием.

struct B;

struct A : Base {
  // ...
  A(const B& b);
};

struct B : Base {
    // ...
};

// ...
A::A(const B& b) : Base{b} {}

Обратите внимание, что конструктором, который принимает аргумент другого типа, является , а не конструктор копирования.

0 голосов
/ 11 июня 2019

Вы можете определить struct B до struct A.

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