Унаследовать конструкторы и добавить дополнительно - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть один класс Saver (производный от QObject) и один, который является производным от этого класса Saver (Creator).В классе Saver я определил несколько конструкторов, которые я хочу использовать при инициализации класса Creator.Но также у меня есть дополнительные конструкторы в классе Creator.Я использую:

Saver::Saver

в классе Creator для наследования конструкторов, и это работает хорошо, если я не добавляю дополнительные конструкторы.Вот заголовки классов:

class Saver : public QObject
{
    Q_OBJECT
public:
    explicit Saver();
    explicit Saver(QVector<QOpenGLVertexArrayObject *> vaos);
    explicit Saver(QVector<QOpenGLTexture *> textures);
};


class Creator : public Saver
{
    Q_OBJECT
public:
    using Saver::Saver;
    //Works well unless I add the following two lines
    Creator(QVector<Creator *> creators);
    Creator(Creator *creator);
};

Нужно ли переопределять все конструкторы (их гораздо больше, чем в этом примере) или есть какое-то другое решение?

1 Ответ

0 голосов
/ 10 сентября 2018

Вот пример Minimal, Complete и Verifiable , который дублирует проблему.

struct type_a {};
struct type_b {};

class Saver
{
   public:
      explicit Saver() {}
      explicit Saver(type_a) {}
};


class Creator : public Saver
{
   public:
      using Saver::Saver;
      Creator(type_b) {}
};

int main()
{
   Creator c1;
   Creator c2(type_a{});
   Creator c3(type_b{});
};

Один из способов решения проблемы - удалить квалификатор explicit из конструктора по умолчаниюбазового класса и добавьте реализацию по умолчанию конструктора по умолчанию в производный класс.

struct type_a {};
struct type_b {};

class Saver
{
   public:
      Saver() {}
      explicit Saver(type_a) {}
};


class Creator : public Saver
{
   public:
      using Saver::Saver;
      Creator() = default;
      Creator(type_b) {}
};

int main()
{
   Creator c1;
   Creator c2(type_a{});
   Creator c3(type_b{});
};

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

struct type_a {};
struct type_b {};

class Saver
{
   public:
      explicit Saver() {}
      explicit Saver(type_a) {}
};


class Creator : public Saver
{
   public:
      using Saver::Saver;
      Creator() = default;
      Creator(type_b) : Saver() {}
};

int main()
{
   Creator c1;
   Creator c2(type_a{});
   Creator c3(type_b{});
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...