Форум программистов, компьютерный форум CyberForum.ru

Вектор из указателей абстракттного класса - C++

Восстановить пароль Регистрация
 
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
21.08.2013, 19:25     Вектор из указателей абстракттного класса #1
Критически прошу помощи !
Есть абстрактный класс и два его дочерних. В дочерних переопределена чисто виртуальная функция вычисления зарплаты (собственно, это единственное различие между этими классами). Необходимо создать вектор указателей, элементами которого будут работники с параметрами const string &n, int i, double wage (имя, id, зарплата). Затем отсортировать вектор по зарплате и, если зарплаты совпадают, то сортировать по имени.
Два вопроса:
1. Как создать вектор, который сортировался бы именно по параметрам зарплаты и имени ?
2. Как заставить программу понимать, какой из методов подсчета зарплаты использовать ? (понимаю, что с помощью полиморфизма и указателей на базовый класс, но до реализации дорубиться не могу)

Собственно, сами классы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Employee
{   
    string name;
    int id;
    
    public:
    double wage;
    Employee(const string &n, int id);
    virtual void wage_count() = 0;
    void show();
    virtual ~Employee(){};
};
 
 
class Bytime : public Employee
{
    
    double b_w;
    double b_wage;
    public:
    Bytime(const string &n, int id, double b_w);
    virtual void wage_count();
};
 
class Fixed : public Employee
{
    
    double f_w;
    double f_wage;
    public:
    Fixed(const string &n, int id, double f_w);
    virtual void wage_count ();
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
21.08.2013, 19:47     Вектор из указателей абстракттного класса #2
oodessit,
1. Зачем абстрактоному классу конструктор и деструктор?
2. Что такое b_w, b_wage и f_w, f_wage. Как я понимаю это почасовая ставка и количество часов (нед/мес?). Но тогда чем отличается Bytime от Fixed ?
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
21.08.2013, 19:53  [ТС]     Вектор из указателей абстракттного класса #3
IGPIGP ,
Без конструктора не переопределяется функция вычисления, которые описаны позже. В них и разница между Fixed и Bytime. Возможно, дебильный вариант, но другого в голову не пришло.
Суть не в том. В задании есть еще ряд задач, которые я не могу выполнить без этой сортировки.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Fixed::Fixed(const string &n, int id, double f_w) : Employee(n,id)
{
    f_wage = f_w;
}
 
Bytime::Bytime(const string &n, int id, double b_w) : Employee(n,id)
{
    b_wage = b_w;
}
 
void Bytime::wage_count()
{
    wage = 20.8*8*b_wage;
}
 
void Fixed::wage_count()
{
    wage = f_wage;
}
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
21.08.2013, 20:30     Вектор из указателей абстракттного класса #4
Цитата Сообщение от IGPIGP Посмотреть сообщение
Зачем абстрактоному классу конструктор и деструктор?
Виртуальный деструктор обязан быть у любого полиморфного класса.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
21.08.2013, 21:14     Вектор из указателей абстракттного класса #5
Цитата Сообщение от fasked Посмотреть сообщение
Виртуальный деструктор обязан быть у любого полиморфного класса.
Верно, что-то я сказал не то.
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
21.08.2013, 23:12  [ТС]     Вектор из указателей абстракттного класса #6
ок. Со вторым вопросом я разобрался (надо было внимательней книжку читать )
остается вопрос с сортировкой по двум параметрам. Дайте, пожалуйста, хоть похожий код сортировки вектора
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
22.08.2013, 04:16     Вектор из указателей абстракттного класса #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <windows.h>
using namespace std;
class Employee
{  public: 
    string name;
    int id;    
    double wage;
    Employee();
    Employee(const string n, int id_);
    virtual void wage_count() = 0;
    virtual void show(){cout<<name<<" "<<wage<<endl;};
    virtual ~Employee(){};
static  int Compirer(Employee *one, Employee *two);
};
int Employee::Compirer(Employee *one, Employee *two){
    if(one->wage == two->wage)
        return (one->name.compare(two->name.c_str())<0)? 1:0;
    else
        return (one->wage > two->wage)? 1 : 0;
}
 class Bytime : public Employee
{    
    double b_w;
    double b_wage;
    public:
    Bytime();
    Bytime(const string n, int id, double b_w);
    virtual void wage_count();
};
 class Fixed : public Employee
{    
    double f_w;
    double f_wage;
    public:
    Fixed();
    Fixed(const string n, int id, double f_w);
    virtual void wage_count ();
};
//---------------------------
Employee::Employee()
{}
Employee::Employee(const string n, int id_):name(n), id(id_)
{}
Fixed::Fixed()
{}
Fixed::Fixed(const string n, int id, double f_w) : Employee(n,id)
{
    f_wage = f_w;
}
Bytime::Bytime()
{}
Bytime::Bytime(const string n, int id, double b_w) : Employee(n,id)
{
    b_wage = b_w;
}
void Bytime::wage_count()
{
    wage = 20.8*8*b_wage;
}
void Fixed::wage_count()
{
    wage = f_wage;
}
//--------------------------------
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);
Bytime bt("Vasya", 1, 5.0);
Bytime bt1("Basya", 2, 6.0);
Fixed fx("Alice", 3, 832.0);
Fixed fx1("Sonya", 4, 850.0);
vector<Employee*> emp;
emp.push_back(&bt);
emp.push_back(&bt1);
emp.push_back(&fx);
emp.push_back(&fx1);
 
for(int i = 0; i < 4; ++i) {
    emp[i]->wage_count();
    emp[i]->show();
}
sort(emp.begin(), emp.end(), &Employee::Compirer);
cout<<"-------------------"<<endl;
for(int i = 0; i < 4; ++i) {
    emp[i]->show();
}
cin.get();   
return 0;
}
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
22.08.2013, 18:26  [ТС]     Вектор из указателей абстракттного класса #8
спасибо огромное. Все работает
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6176 / 2905 / 284
Регистрация: 04.12.2011
Сообщений: 7,730
Записей в блоге: 3
23.08.2013, 02:04     Вектор из указателей абстракттного класса #9
Цитата Сообщение от oodessit Посмотреть сообщение
Все работает
Рад помочь. Только ценность такого вектора или массива достаточно спорна.
Вы можете получить доступ легко, только к полям и методам базового класса и виртуальным методам наследников. Поля и обычные методы наследников без нервов получить не получится. То есть, при полиморфном наследовании, конечно можно узнать тип и выполнив приведение получить доступ, но это страшненько.

Не по теме:

где учитесь?

oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
23.08.2013, 15:51  [ТС]     Вектор из указателей абстракттного класса #10
Сам по себе учусь. Есть связи, которые пообещали устроить работать, если научусь
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 15:59     Вектор из указателей абстракттного класса
Еще ссылки по теме:

C++ Как правильно очищать вектор указателей
Вектор указателей C++
C++ Вектор ссылок и вектор указателей

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
IGPIGP
23.08.2013, 15:59     Вектор из указателей абстракттного класса
  #11

Не по теме:

Цитата Сообщение от oodessit Посмотреть сообщение
Сам по себе учусь.
Ну, что же, наш город богат рыбой. Ежьте побольше. Удачи!

Yandex
Объявления
23.08.2013, 15:59     Вектор из указателей абстракттного класса
Ответ Создать тему
Опции темы

Текущее время: 02:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru