1

Тема: С++ абстрактний клас

Створити абстрактний клас Worker з полями, які задають прізвище працівника, прізвища керівника і підлеглих і
віртуальними методами виведення списку обов'язків та списку підлеглих на екран.
На його основі реалізувати класи Manager (керівник проекту), Developer (розробник) і Coder (молодший програміст).
Створити клас Group (група), що містить масив / параметризрвані колекцію об'єктів цих класів в динамічній пам'яті.
Передбачити можливість виведення всіх об'єктів списку і вибірки на прізвище з висновком всього дерева підлеглих.
Написати демонстраційну програму, в якій будуть використовуватися всі методи класів.
Допоможіть будь-ласка доробити

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string.h>

using namespace std;

class worker
{
    public:
    char name[100];
    virtual void setlastname(char *s) = 0;
};

class managerublic worker
{
    public:
    void setlastname(char *s)
    {
        strcpy (name, s);
    }
};
class developerublic worker
{

};
class coder
{

};
class group1
{
    manager *manager1;
};


int main()
{
    manager A1;
    A1.setlastname((char *)"Ivanov");
}

2

Re: С++ абстрактний клас

Завдання дали вам, а не нам, бо ви з нього чомусь маєте навчитися. У вас узагалі нічого не виходить, навіть підручник прочитати? Значить, ви не ту спеціальність обрали, і в ваших інтересах якомога швидше перевестися туди, де вас не змушуватимуть робити те, що у вас узагалі не виходить. У вас не виходить щось конкретне? Будь ласка, напишіть, що саме. Ви бачите, що ваш код не компілюється? Ви знаєте, як це виправити? Якщо так - виправте, це цілком у ваших силах. Якщо ні - сформулюйте, що саме не виходить, і питайте, ми вам допоможемо. Але "дороблення" вам не допоможе, а нам, загалом кажучи, може зашкодити. Я не хочу, щоб людина, за яку "доробляли" код, потім отримувала диплом з позначкою "програміст", а далі - не дай Боже - програмувала літак чи медичне обладнання.

Подякували: leofun011

3

Re: С++ абстрактний клас

Хочу зрозуміти, як щось описати в класі і потім це реалізувати в головній функції

4

Re: С++ абстрактний клас

sasha87 написав:

Хочу зрозуміти, як щось описати в класі і потім це реалізувати в головній функції

Тоді ви заскладне завдання взяли - вам треба базовий синтаксис класів учити, а не віртуальні функції.
Почніть з класу "працівник", якому можна поставити прізвище. Потім додайте йому менеджера.

І розставте відступи, ви ж самі собі гірше робите - цей код просто складно читати.

Подякували: leofun011

5

Re: С++ абстрактний клас

managerublic worker

Велике Ніщо з'їло літери? Чи підхопив синдром Ctrl+c ctrl+v?

6 Востаннє редагувалося koala (14.05.2020 17:03:19)

Re: С++ абстрактний клас

Ось код... але чомусь не виводить список груп (пункт 7 - case7)
І видає помилку, хоча раніше працювало нормально
Error    LNK1168    cannot open C:\Users\Sasha87\OneDrive\Документи\ДОКУМЕНТИ\ШАГ\C++_клас(наслідування)\x64\Debug\C++_клас(наслідування).exe for writing    C++_клас(наслідування)    C:\Users\Sasha87\OneDrive\Документи\ДОКУМЕНТИ\ШАГ\C++_клас(наслідування)\C++_клас(наслідування)\LINK    1   
   

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<list>
#include<windows.h>

using namespace std;
class worker
{
protected:
    string name;
    string lastname;
    string position;
    list<string> spisok_сhief;
    list<string> spisok_podchinenyy;
    list<string> spisok_obazannostey;
public:
    virtual void SetLastname(string) = 0;
    virtual void SetName(string) = 0;
    virtual void SetPosition(string) = 0;
    virtual void ShowMustDoList() = 0;
    virtual void SetMustDoList() = 0;
    virtual void SetPodchinenyyList() = 0;
    virtual void ShowLastName() = 0;
    virtual void ShowFirstName() = 0;
    virtual list<string>& GetListOfPodch() = 0;
public:
};

class manager :public worker
{
public:
    void SetLastname(string s) override
    {
        lastname = s;
    }
    void SetName(string s) override
    {
        name = s;
    }
    void SetPosition(string s) override
    {
        position = s;
    }
    void ShowMustDoList() override
    {
        if (this->spisok_obazannostey.size() == 0)
            cout << "Нема завдань, які треба виконати" << endl;
        else
        {
            int i = 1;
            for (std::list<string>::iterator it = spisok_obazannostey.begin(); it != spisok_obazannostey.end(); ++it)
                cout << "Завдання " << i << " - " << *it << endl;
            i++;
        }
    }
    virtual void SetMustDoList()
    {}
    void SetPodchinenyyList() override
    {
        if (this->spisok_podchinenyy.size() == 0)
            cout << "Підлеглих нема" << endl;

        //виводить список підлеглих на екран
        else
        {
            int i = 1;
            for (std::list<string>::iterator it = spisok_podchinenyy.begin(); it != spisok_podchinenyy.end(); ++it)
                cout << "Підлеглий " << i << " - " << *it << endl;
            i++;
        }
    }
    void ShowFirstName() override
    {
        cout << "ім'я - " << this->name << endl;
    }
    void ShowLastName() override
    {
        cout << "прізвище - " << this->lastname << endl;
    }
    list<string>& GetListOfPodch() override
    {
        return this->spisok_podchinenyy;
    }

};
class developer:public worker
{
public:
    void SetLastname(string s) override
    {
        lastname = s;
    }
    void SetName(string s) override
    {
        name = s;
    }
    void SetPosition(string s) override
    {
        position = s;
    }
    void ShowMustDoList() override
    {
        if (this->spisok_obazannostey.size() == 0)
            cout << "Не поступило завдань від менеджера" << endl;
        else
        {
            int i = 1;
            for (std::list<string>::iterator it = spisok_obazannostey.begin(); it != spisok_obazannostey.end(); ++it)
                cout << "виконує вказівки менеджера" << i << " - " << *it << endl;
            i++;
        }
    }
    virtual void SetMustDoList() 
    {}
    void SetPodchinenyyList() override {
        if (this->spisok_podchinenyy.size() == 0)
            cout << "Підлеглих нема" << endl;
        else
        {
            int i = 1;
            for (std::list<string>::iterator it = spisok_podchinenyy.begin(); it != spisok_podchinenyy.end(); ++it)
                cout << "Підлеглий " << i << " - " << *it << endl;
            i++;
        }
    }
    void ShowFirstName() override
    {
        cout << "ім'я - " << this->name << endl;
    }
    void ShowLastName() override
    {
        cout << "прізвище - " << this->lastname << endl;
    }
    list<string>& GetListOfPodch() override
    {
        return this->spisok_podchinenyy;
    }

};

class coder :public worker
{
public:
    void SetLastname(string s) override
    {
        lastname = s;
    }
    void SetName(string s) override
    {
        name = s;
    }
    void SetPosition(string s) override
    {
        position = s;
    }
    void ShowMustDoList()override
    {
        if (this->spisok_obazannostey.size() == 0)
            cout << "допомога девелоперу не потрібна" << endl;
        else
        {
            int i = 1;
            for (std::list<string>::iterator it = spisok_obazannostey.begin(); it != spisok_obazannostey.end(); ++it)
                cout << "програмує на C++ та заносить інформацію в БД" << i << " - " << *it << endl;
            i++;
        }
    }
    virtual void SetMustDoList()
    {}
    void SetPodchinenyyList() override 
    {
        
        
    }
    void ShowFirstName() override
    {
        cout << "ім'я - " << this->name << endl;
    }
    void ShowLastName() override
    {
        cout << "прізвище - " << this->lastname << endl;
    }
    list<string>& GetListOfPodch() override
    {
        list<string>* tmp = NULL;
        return *tmp;
    }

};
class group
{
public:
    list<manager> list_of_managers;
    list<developer> list_of_developers;
    list<coder> list_of_coders;
    
    //list<group>list_of_groups;
    group() { list_of_managers.clear();
    }
    
};
            
int main()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    int menu;
    int sub_menu;
    string txt;
    string txt_for_new_person;
    manager tmp_manager;
    developer tmp_developer;
    coder tmp_coder;
    list<manager>::iterator tmp_iter_man;
    list<developer>::iterator tmp_dev_man;
    list<coder>::iterator tmp_cod_man;
    list<group>::iterator tmp_group;
    group gr;
    do {
        system("CLS");
        cout << "1 - Додати менеджера" << endl;
        cout << "2 - Показати всіх менеджерів" << endl;
        cout << "3-Додати розробника" << endl;
        cout << "4 - Показати всіх розробників" << endl;
        cout << "5 - додати молодшого програміста" << endl;
        cout << "6 - показати всіх молодших програмістів" << endl;
        cout << "7 - переглянути список груп" << endl;
        cout << "8 - Вийти" << endl;
        cout << "Зробіть свій вибір" << endl;
        cin >> menu;
        switch (menu)
        {
        case 1:cout << "Давайте додамо менеджера" << endl;


            cout << "Введіть прізвище менеджера" << endl;
            cin >> txt;
            tmp_manager.SetLastname(txt);

            cout << "Введіть ім'я менеджера" << endl;
            cin >> txt;
            tmp_manager.SetName(txt);

            cout << "Введіть посаду" << endl;
            cin >> txt;
            tmp_manager.SetPosition(txt);
            gr.list_of_managers.push_back(tmp_manager);
            tmp_iter_man = gr.list_of_managers.end();
            tmp_iter_man--;
            cout << "Нового менеджера додано в список." << endl;
            do
            {
                system("CLS");
                cout << "В цього менеджера є підлеглі ? (1 - додати підлеглого, 0 - ні)" << endl;
                cin >> sub_menu;
                if (sub_menu == 0)
                {
                    cout << "Ok. На цьому список підлеглих закінчено" << endl;
                    break;
                }
                cout << "Введіть прізвище підлеглого для нового менеджера" << endl;
                cin >> txt;
                tmp_iter_man->GetListOfPodch().push_back(txt);

            } while (true);
            system("pause");
            break;
        case 2:cout << "Виводжу на екран список всіх менеджерів групи" << endl;
            if (gr.list_of_managers.size() == 0)
                cout << "Ой, а менеджерів у групі і нема" << endl;
            else
                for (std::list<manager>::iterator it_man = gr.list_of_managers.begin(); it_man != gr.list_of_managers.end(); ++it_man)
                {
                    it_man->ShowLastName();
                    it_man->ShowFirstName();
                    if (it_man->GetListOfPodch().size() == 0)
                        cout << "У цього менеджера немає підлеглих" << endl;
                    else
                    {
                        list<string> lst_podch = it_man->GetListOfPodch();
                        int i = 0;
                        for (std::list<string>::iterator it_podch = lst_podch.begin(); it_podch != lst_podch.end(); ++it_podch)
                        {
                            cout << "Підлеглий " << i << " - " << *it_podch << endl;
                            i++;
                        }
                    }
                }
            system("pause");
            break;

        case 3:cout << "виводжу на екран список розробників" << endl;
            if (gr.list_of_developers.size() == 0)
                cout << "в групі немає розробників" << endl;
            cout << "введіть прізвище розробника" << endl;
            cin >> txt;
            tmp_developer.SetLastname(txt);
            cout << "введіть ім'я розробника" << endl;
            cin >> txt;
            tmp_developer.SetLastname(txt);
            cout << "Введіть посаду" << endl;
            cin >> txt;
            tmp_developer.SetPosition(txt);
            gr.list_of_developers.push_back(tmp_developer);
            tmp_dev_man = gr.list_of_developers.end();
            tmp_dev_man--;
            cout << "Нового розробника додано в список." << endl;
            do
            {
                system("CLS");
                cout << "В цього розробника є підлеглі ? (1 - додати підлеглого, 0 - ні)" << endl;
                cin >> sub_menu;
                if (sub_menu == 0)
                {
                    cout << "Ok. На цьому список підлеглих закінчено" << endl;
                    break;
                }
                cout << "Введіть прізвище підлеглого для нового розробника" << endl;
                cin >> txt;
                tmp_dev_man->GetListOfPodch().push_back(txt);

            } while (true);
            system("pause");
            break;
        case 4:cout << "Виводжу на екран список всіх розробників групи" << endl;
            if (gr.list_of_developers.size() == 0)
                cout << "розробників у групі нема" << endl;
            else
                for (std::list<developer>::iterator dev_man = gr.list_of_developers.begin(); dev_man != gr.list_of_developers.end(); ++dev_man)
                {
                    dev_man->ShowLastName();
                    dev_man->ShowFirstName();
                    if (dev_man->GetListOfPodch().size() == 0)
                        cout << "У цього розробника немає підлеглих" << endl;
                    else
                    {
                        list<string> lst_podch = dev_man->GetListOfPodch();
                        int i = 0;
                        for (std::list<string>::iterator it_podch = lst_podch.begin(); it_podch != lst_podch.end(); ++it_podch)
                        {
                            cout << "Підлеглий " << i << " - " << *it_podch << endl;
                            i++;
                        }
                    }
                }
            system("pause");
            break;
        case 5: cout << "виводжу на екран список програмістів" << endl;
            if (gr.list_of_coders.size() == 0)
                cout << "в групі немає програмістів" << endl;
            cout << "введіть прізвище програміста" << endl;
            cin >> txt;
            tmp_coder.SetLastname(txt);
            cout << "введіть ім'я програміста" << endl;
            cin >> txt;
            tmp_coder.SetLastname(txt);
            cout << "Введіть посаду" << endl;
            cin >> txt;
            tmp_coder.SetPosition(txt);
            gr.list_of_coders.push_back(tmp_coder);
            tmp_cod_man = gr.list_of_coders.end();
            tmp_cod_man--;
            cout << "Нового програміста додано в список." << endl;

            break;
        case 6:cout << "Виводжу на екран список всіх програмістів групи" << endl;
            if (gr.list_of_coders.size() == 0)
                cout << "програмістів у групі нема" << endl;
            else
                for (std::list<coder>::iterator cod_man = gr.list_of_coders.begin(); cod_man != gr.list_of_coders.end(); ++cod_man)
                {
                    cod_man->ShowLastName();
                    cod_man->ShowFirstName();
                }
            system("pause");
            break;

            cout << "Всього найкращого" << endl;
            system("pause");
            exit(0);
        case 7:cout << "показати список груп" << endl;
            if (gr.list_of_managers.size() == 0)

                for (std::list<manager>::iterator groups = gr.list_of_managers.begin(); groups != gr.list_of_managers.end(); groups++)
                {
                    tmp_iter_man->ShowLastName();
                    tmp_iter_man->ShowFirstName();
                    gr.list_of_managers.push_back(*tmp_iter_man);
                }
            if (gr.list_of_developers.size() == 0)
                for (std::list<developer>::iterator groups = gr.list_of_developers.begin(); groups != gr.list_of_developers.end(); groups++)
                {
                    tmp_dev_man->ShowLastName();
                    tmp_dev_man->ShowFirstName();
                    gr.list_of_developers.push_back(*tmp_dev_man);
                }

            if (gr.list_of_coders.size() == 0)
                for (std::list<coder>::iterator groups = gr.list_of_coders.begin(); groups != gr.list_of_coders.end(); groups++)
                {
                    tmp_cod_man->ShowLastName();
                    tmp_cod_man->ShowFirstName();
                    gr.list_of_coders.push_back(*tmp_cod_man);
                }
            
        }
    } while (menu != 8);

    system("pause");
}

7

Re: С++ абстрактний клас

Для початку: використовуйте теги code, щоб смайликів не було; і не описуйте, чого програма не робить, описуйте, що робить і чим це відрізняється від потрібного. Тобто не "не виводить список (пункт 7) - а "якщо вибрати 7, одразу запитує вибір наступного пункту" чи якось так.
(я теги зараз додам).
Далі, помилка означає неможливість збірки. Тобто одночасно помилка і неправильний вивід не бувають; а судячи з помилки (не може відкрити файл .exe), ви запустили результат попередньої збірки, чим і завадили поточній. Зупиніть всі запущені процеси своєї програми (можливо, навіть перезавантажте комп'ютер) і запустіть збірку заново, помилка зберігається? Якщо ні - перевірте знову цей п.7, можливо, помилка була в попередній версії, а після перезбірки зникне.

8

Re: С++ абстрактний клас

Тепер по п.7.
В C++11, щоб уникнути оцієї важкої конструкції

for (std::list<coder>::iterator groups = gr.list_of_coders.begin(); groups != gr.list_of_coders.end(); groups++)
{
  groups->зробити_щось_там();
}

запроваджений спрощений синтаксис:

for (coder& groups: list_of_coders)
{
    groups.зробити_щось_там();//groups тут не ітератор, а посилання, тому через .
}

Але і так, і так цикл по 0 елементів буде виконувати 0 разів. Перевірте ще раз логіку.

Подякували: leofun011

9 Востаннє редагувалося koala (15.05.2020 09:51:20)

Re: С++ абстрактний клас

А ще раджу рознести все з гілок по різних функціях, щоб не плутатися, де що відбувається.

switch (menu)
{
    case 1: 
        input_manager(&gr);
    break;
    case 2:
        show_managers(&gr);
    break;
    ...
}

Функції і параметри умовні, можете власні зробити, як вам зручно.
Тоді одразу буде видно, де яку функцію треба лагодити, а не шукати на простирадлі.