Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2021, 00:07   #1
matveibelov65100
Новичок
Джуниор
 
Регистрация: 28.09.2021
Сообщений: 3
По умолчанию Иерархия классов C++

Написать программу, в которой создается иерархия классов. Включить полиморфные объекты в связанный список, используя статические компоненты класса. Показать использование виртуальных функций.
Порядок выполнения работы.
1. Определить иерархию классов (в соответствии с вариантом).
2. Определить в классе статическую компоненту - указатель на начало связанного списка объектов и статическую функцию для просмотра списка.
3. Реализовать классы.
4. Написать демонстрационную программу, в которой создаются объекты различных классов и помещаются в список, после чего список просматривается.
5. Сделать соответствующие методы не виртуальными и посмотреть, что будет.
6. Реализовать вариант, когда объект добавляется в список при создании, т.е. в конструкторе

Все что смог сделал, можете поправить код? Иерархия если что: персона-служащий и рабочий. От служащего - инженер
Код:
#include <iostream>
#include <string>
 
 
using namespace std;
 
class Persona
{
protected:
    string Surname;//фамилия
    string Pol;//пол
    string Dolgnost;
    int Stag;//стаж
    int Kategiria;
 
public:
    Persona(string Surname_input, string Pol_input, string Dolgnost_input, int Stag_input, int Kategiria_input)
    {
        Surname = Surname_input;
        Pol = Pol_input;
        Stag = Stag_input;
        Kategiria = Kategiria_input;
        Dolgnost = Dolgnost_input;
    }
    void Show()
    {
        cout << "Название: " << Surname << endl;
        cout << "Пол: " << Pol << endl;
        cout <<"Должность: "<< Dolgnost << endl;
        cout << "Стаж: " << Stag << endl;
        cout << "Категория: " << Kategiria << endl;
    }
};
 
class Employee : public Persona//служащий
{
public:
    Employee(string Surname_input_O, string Pol_input_O, string Dolgnost_input_O, int Stag_input_O, int Kategiria_input_O) :Persona(Surname_input_O,  Pol_input_O,  Dolgnost_input_O,  Stag_input_O, Kategiria_input_O)
    {
 
    }
};
 
class Worker : public Persona//рабочий
{
public:
    Worker(string Surname_input_W, string Pol_input_W, string Dolgnost_input_W, int Stag_input_W, int Kategiria_input_W) :Persona(Surname_input_W, Pol_input_W, Dolgnost_input_W, Stag_input_W, Kategiria_input_W)
    {
        
    }
    
};
 
class Engeener :public Employee//инженер
{
public:
    Engeener(string Surname_input_E, string Pol_input_E, string Dolgnost_input_E, int Stag_input_E, int Kategiria_input_E) :Employee(Surname_input_E, Pol_input_E, Dolgnost_input_E, Stag_input_E, Kategiria_input_E)
    {
 
    }
};
matveibelov65100 вне форума Ответить с цитированием
Старый 30.09.2021, 09:25   #2
CyberStudent
Пользователь
 
Регистрация: 26.11.2020
Сообщений: 10
По умолчанию

Почитайте про наследование и полиморфизм С++)
Quid non vos occiderem fortior!

Последний раз редактировалось CyberStudent; 30.09.2021 в 09:54. Причина: No help coding
CyberStudent вне форума Ответить с цитированием
Старый 02.10.2021, 20:04   #3
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Цитата:
Сообщение от matveibelov65100 Посмотреть сообщение
Все что смог сделал, можете поправить код?
6 пункт скидывать не буду

Код:
#include <iostream>
#include <string>

using namespace std;

class Persona
{
public:
    struct PersonBlock { // Структура для односвязного спика, по умолчанию пусть указатели будут nullptr, то есть, ни на что не указывают
        // но в нашем счлучает это не даст никакого профита, ибо мы не создаем объекты структуры, а только ссылки этого типа
        Persona* currentPerson{ nullptr };
        PersonBlock* nextPerson{ nullptr };
    };

    static PersonBlock* personList; // Статический односвязный список. Что значит статический в понимании классов С++? Значит, он общий для всех объектов этого класса и наследующих его.

private: // Зачем использовать protected?
    string m_surname; // Названия переменных с маленькой буквы (общеприято)
    string m_pol; // Приставка m_ сообщает, что это член класса, а не какая нибудь другая переменная, это так же общепринято
    string m_dolgnost; // Еще стоит называть переменные по английски, но думаю это очевидно)
    int m_stag;
    int m_kategoria;

public:
    Persona(string surname, string pol, string dolgnost, int stag, int kategoria)
        :m_surname(surname), m_pol(pol), m_dolgnost(dolgnost), m_stag(stag), m_kategoria(kategoria) {}
    // Если есть возможность, нужно использовать списки инициализации т.к. в этом случае объект класса сразу создается с необходимыми значениями
    // Иначе он создается с переменными у которых будет значение по умолчанию, которое в последствии будет перезаписано

    static void printList() // Обычно функции пишут с маленькой, с большой - классы, структуры, перечисления
    {
        if (!personList)
        {
            cout << "Список пуст." << endl;
            return;
        }

        while (personList)
        {
            cout << personList->currentPerson->getClassName()
                << "\nНазвание: " << personList->currentPerson->m_surname // Не нужно использовать cout для вывода каждой строки отдельно
                << "\nПол: " << personList->currentPerson->m_pol
                << "\nДолжность: " << personList->currentPerson->m_dolgnost
                << "\nСтаж: " << personList->currentPerson->m_stag
                << "\nКатегория: " << personList->currentPerson->m_kategoria << endl;
            personList = personList->nextPerson;
        }
    }

    static void addPersonToList(Persona* person)
    {
        PersonBlock* newPerson = (PersonBlock*)(new size_t(sizeof(Persona*) + sizeof(PersonBlock*)));
        newPerson->currentPerson = person;
        newPerson->nextPerson = nullptr;
        if (!personList)
        {
            personList = newPerson;
        }
        else
        {
            PersonBlock* tempList = personList;
            while (tempList->nextPerson) {
                tempList = tempList->nextPerson;
            }
            tempList->nextPerson = newPerson;
        }
    }

    virtual string getClassName() // Ключевое слово virtual означает, что этот метод может быть переопределен дочерними классами
        // и если это будет сделано, гарантировано, что при вызове такого метода будет вызвана самый ближайший к объекту виртуальный метод
        // Этот механизм обеспечивается "виртуальной таблицей", которая содержит список всех виртуальных методов текущего класса и ссылку на виртуальную таблицу родительского(их) классов
        // виртуальная таблиа есть у всех объектов класса в иерархии которого есть хотя бы один класс с виртуальным методом, она увеличивает объем памяти под объект ровно на sizeof указателя на неё (или на машинное слово, не скажу точно)
    {
        return "Persona";
    };
};

Persona::PersonBlock* Persona::personList = nullptr; // Явно определяем статическую переменную класса, подобно глобальным переменным

class Employee :public Persona
{
public:
    Employee(string surname, string pol, string dolgnost, int stag, int kategoria)
        :Persona(surname, pol, dolgnost, stag, kategoria) {}

    string getClassName() override // ключевое слово override указывает на то, что этот метод является переопределением виртуального метода одного из родителей, если убрать virtual выше, то будет ошибка
    {
        return "Employee";
    }
};

class Engeener :public Employee
{
public:
    Engeener(string surname, string pol, string dolgnost, int stag, int kategoria)
        :Employee(surname, pol, dolgnost, stag, kategoria) {}

    string getClassName() override
    {
        return "Engeener";
    }
};

class Worker :public Persona
{
public:
    Worker(string surname, string pol, string dolgnost, int stag, int kategoria)
        :Persona(surname, pol, dolgnost, stag, kategoria) {}

    string getClassName() override
    {
        return "Worker";
    }
};

int main()
{
    Persona person1{ "Имя1", "М1", "Директор1", 1, 1 };
    Employee person2{ "Имя2", "М2", "Директор2", 2, 2 };
    Engeener person3{ "Имя3", "М3", "Директор3", 3, 3 };
    Worker person4{ "Имя4", "М4", "Директор4", 4, 4 };

    Persona::addPersonToList(&person1);
    Persona::addPersonToList(&person2);
    Persona::addPersonToList(&person3);
    Persona::addPersonToList(&person4);

    Persona::printList();

    cin.clear();
    cin.ignore(32767, '\n');
    cin.get();

    return 0;
}
формошлеп.рф
witech.su

Последний раз редактировалось maks1331; 02.10.2021 в 23:01.
maks1331 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Иерархия классов taras99 Помощь студентам 0 05.05.2019 14:45
Иерархия классов на C# s4egol Помощь студентам 4 05.09.2014 07:41
ИЕРАРХИЯ КЛАССов DEVU Помощь студентам 2 15.05.2012 08:17
Иерархия классов К_С_Ю Помощь студентам 1 19.04.2012 02:39
Иерархия классов lirikoff Помощь студентам 7 21.10.2010 23:51