Список ссылок содержит различные классы объектов в cpp - PullRequest
0 голосов
/ 04 февраля 2020

Как мы можем создать связанный список, который может содержать другой класс объекта. например, если человек является базовым классом, и у него есть ученик и учитель в качестве производного класса, то как я могу создать связанный список, который может содержать оба класса объектов, таких как ученик и учитель.

LinkedList example for understanding my problem:
head->studentobject->teacherobject->studentobject->teacherobject... so on

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

Попробуйте здесь . std::list - это связанный список. ,

#include <list>
#include <iostream>
#include <memory>
using namespace std;

class Person {
public:
    virtual ~Person() = default;
    virtual void talk()=0;
};

class Student : public Person {
public:
    void talk() {
        cout << "Teach me!\n";
    }
};

class Teacher : public Person {
    public:
    void talk() {
        cout << "Listen!\n";
    }
};

int main() {
    list<std::unique_ptr<Person>> people;
    people.push_back(unique_ptr<Person>(new Student()));
    people.push_back(unique_ptr<Person>(new Teacher()));

    for (auto& p : people) {
        p->talk();
    }

    return 0;
}
1 голос
/ 04 февраля 2020

Обычно вы создаете базовый класс и производные классы:

#include <iostream>
#include <list>
#include <memory>

class Base {
public:
    virtual ~Base() = default;

    virtual void printClass() = 0;
};

class Student : public Base {
public:
    virtual void printClass() { std::cout << "Student\n"; }
};

class Teacher : public Base {
public:
    virtual void printClass() { std::cout << "Teacher\n"; }
};

class Node {
public:
    void setTeacher() {
        data = std::make_unique<Teacher>();
    }
    void setStudent() {
        data = std::make_unique<Student>();
    }

    void printClass() { data->printClass(); }

private:
    std::unique_ptr<Base> data;
};

int main() {
    std::list<Node> l;
    l.push_back({});
    l.front().setTeacher();
    l.front().printClass();
}

Используйте некоторый указатель для хранения ссылок. Вы можете использовать необработанные указатели, ссылки, умные указатели, ...

Здесь вы можете прочитать когда использовать виртуальные деструкторы

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