C ++ :: как сделать конструктор класса с множественным наследованием? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать конструктор в подклассе, который будет вызывать конструкторы суперкласса.Вот код.

Я объявил три класса, как это:

class Sub1 {
    private:
    std::vector<MainClass> subvar_1;

    public:
    Sub1(int);
};

Sub1::Sub1(int size) : subvar_1(size) { }
_____________________________________

class Sub2 {
    private:
    std::vector<MainClass> subvar_2;

    public:
    Sub2(int);
};

Sub2::Sub2(int size) : subvar_2(size) { }
_____________________________________

class Sub3 {
    private:
    std::vector<std::vector<MainClass>> subvar_3;

    public:
    Sub3(std::vector<int>&);
};

Sub3::Sub3(std::vector<int>& size) {
    subvar_3.reserve(size.size());
    for (const int clmns : size)
        subvar_3.emplace_back(std::vector<MainClass>(clmns));
}

Где MainClass определяется следующим образом:

 class MainClass {
     private:
     int row;
     int cln;

     public:
     MainClass();
 };

 MainClass::MainClass() {
     row = rand();
     cln = rand();
 }

После всех этихбыло объявлено, мне нужно поместить все это в мастер-класс, который по иронии судьбы противоположен:

class MasterClass : public Sub1, Sub2, Sub3 {
    public:
    MasterClass(int, int, std::vector<int>&);
};

Это приводит к ошибке.Ошибка говорит о невозможности найти конструкторы Sub1 (), Sub2 () и Sub3 ().Конечно, их нет, они не предназначены для этого.Эта ошибка возникает, когда я запускаю:

MasterClass::MasterClass(int a, int b, std::vector<int>& c) :
    Sub1(a), Sub2(b), Sub3(c) { }

команда.

Я компилирую код, используя:

g++ MainClass.cpp Sub1.cpp Sub2.cpp Sub3.cpp MasterClass.cpp

команда.

Можетты помогаешь мне почему?Как обойти эту ошибку?

Я хотел бы сделать следующее:

MainClass::MainClass (int a, int b, std::vector<int>& c) {
    call constructor Sub1(a);
    call constructor Sub2(b);
    call constructor Sub3(c);
}

Я верю в MasterClass, который мне понадобится:

private:
Sub1 sub1;
Sub2 sub2;
Sub3 sub3;

, гдеЯ назначу результат конструирования объектов, расширяющих класс, в котором я пытаюсь вызвать конструктор?

Возможно ли даже в C ++ сделать это (использовать конструктор класса, который будет вызывать конструктор суперкласса)?

Если нет, есть ли способ обойти проблему, кроме как сохранить ту же структуру?

1 Ответ

1 голос
/ 23 мая 2019

Попробуйте это:

MainClass::MainClass (int a, int b, std::vector<int>& c)
  : Sub1(a), Sub2(b), Sub3(c) {
}

Но перед этим проясните проблему. У вас MainClass агрегировано внутри классов SubX. Как вы планируете объединить класс в себя? Вы имели в виду, что вам нужны ссылки на этот класс из базовых классов?

Одно из возможных решений:

class Sub1;
class Sub2;
class Sub3;
class MainClass;

class Sub1 {
private:
    std::vector<std::shared_ptr<MainClass>> subvar_1;

public:
    Sub1(int);
};
// ...

Проблема в том, что std::vector требует полного типа для своего экземпляра. Вы можете обернуть это во что-то, что не требует этого, например, shared_ptr, но вам нужно решить эту проблему с курицей или яйцом:

class Sub1;
class Sub2;
class Sub3;
class MainClass;

class Sub1 {
private:
    std::shared_ptr<std::vector<MainClass>> subvar_1;

public:
    Sub1(int);
};
// ...

P.S. Первоначально я пытался обернуть его в std :: unique_ptr, но даже это не сработало по той же причине.

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