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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
#1

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

21.08.2013, 19:25. Просмотров 550. Ответов 10
Метки нет (Все метки)

Критически прошу помощи !
Есть абстрактный класс и два его дочерних. В дочерних переопределена чисто виртуальная функция вычисления зарплаты (собственно, это единственное различие между этими классами). Необходимо создать вектор указателей, элементами которого будут работники с параметрами 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 ();
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2013, 19:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вектор из указателей абстракттного класса (C++):

вектор указателей абстрактного класса - C++
Добрый вечер, задача состоит в следующем: найти наибольшую площадь фигуры, посредством использования полиморфизма (родительский абстрактный...

Вектор ссылок и вектор указателей - C++
есть 2 задачи 1-создать вектор ссылок на Employee для хранения различных объектов произвольных классов 2-создать вектор указателей...

Создать массив указателей базового класса и присвоить ему адреса каждого из екземпляров класса - C++
Всем привет. Есть условие задачи: Дан базовый класс Base у которого есть метод my_name, метод выводит сообщение This is Base class. От...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса? - C++
я хотел так, но программа просто падает void Student::add(Base** head) { cout << "I here" << endl; this->setName(); //все...

Вектор указателей - C++
Добрый день) Припустим что у нас есть вектор указателей на что... то, какой размер он будет занимать?) #include <iostream> припустим...

Вектор указателей на класс - C++
Создал класс: class Facility; #ifndef PROCESS_H_ #define PROCESS_H_ class Process { private:

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
21.08.2013, 19:47 #2
oodessit,
1. Зачем абстрактоному классу конструктор и деструктор?
2. Что такое b_w, b_wage и f_w, f_wage. Как я понимаю это почасовая ставка и количество часов (нед/мес?). Но тогда чем отличается Bytime от Fixed ?
0
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;
}
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
21.08.2013, 20:30 #4
Цитата Сообщение от IGPIGP Посмотреть сообщение
Зачем абстрактоному классу конструктор и деструктор?
Виртуальный деструктор обязан быть у любого полиморфного класса.
1
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
21.08.2013, 21:14 #5
Цитата Сообщение от fasked Посмотреть сообщение
Виртуальный деструктор обязан быть у любого полиморфного класса.
Верно, что-то я сказал не то.
0
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
21.08.2013, 23:12  [ТС] #6
ок. Со вторым вопросом я разобрался (надо было внимательней книжку читать )
остается вопрос с сортировкой по двум параметрам. Дайте, пожалуйста, хоть похожий код сортировки вектора
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
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;
}
1
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
22.08.2013, 18:26  [ТС] #8
спасибо огромное. Все работает
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
23.08.2013, 02:04 #9
Цитата Сообщение от oodessit Посмотреть сообщение
Все работает
Рад помочь. Только ценность такого вектора или массива достаточно спорна.
Вы можете получить доступ легко, только к полям и методам базового класса и виртуальным методам наследников. Поля и обычные методы наследников без нервов получить не получится. То есть, при полиморфном наследовании, конечно можно узнать тип и выполнив приведение получить доступ, но это страшненько.

Не по теме:

где учитесь?

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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2013, 15:59
Привет! Вот еще темы с ответами:

Вектор константных указателей - C++
Как мне создать вектор константных указателей? Не вектор указателей на константы, и не константный вектор указателей, а именно вектор...

Вектор указателей на абстрактный класс? - C++
Решаю задачу из книги, там сказано так: &quot;Напишите main(), где создавался бы массив указателей на класс publication. Это очень похоже...

Как правильно очищать вектор указателей - C++
Привет Всем! Есть вопрос по вектору указателей, как правильно очищать память при таком случае очищение происходит существенно медленнее чем...

вектор string в масив указателей на char - C++
Доброго дня, комрады. Вот несколько дней как начал разбираться в С++ по 4-му вводному курсу липмана. наткнулся на задачку в общем-то...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru