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

Работа с вектором из класса - C++

Восстановить пароль Регистрация
 
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
04.09.2013, 02:14     Работа с вектором из класса #1
Доброго времени суток !

Не до конца понимаю "Как это работает"©

Есть вектор указателей, объявленный в main()

vector<Employee*> emp;

который там же и наполняется. Необходимо создать класс для работы с ним. Совсем не ясно, как создать конструктор, принимающий указатель на этот вектор. И непонятно, как к нему через методы этого же класса обращаться. Например, необходимо сохранить инфу из него в файл, а затем прочесть оттуда же.

Сложно мне ООП дается, поэтому прошу разжевать, как маленькому, особенно про конструктор.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 02:14     Работа с вектором из класса
Посмотрите здесь:

C++ Работа с вектором
C++ Создание класса с вектором
C++ Не правильная работа memcpy с вектором - параметром функции
Работа с вектором C++
Работа с функцией класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.09.2013, 02:34     Работа с вектором из класса #2
Цитата Сообщение от oodessit Посмотреть сообщение
Необходимо создать класс для работы с ним.
Класс Employee уже есть?
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
04.09.2013, 02:43  [ТС]     Работа с вектором из класса #3
конечно

в нем int, double и string члены и куча еще всего другого
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.09.2013, 02:52     Работа с вектором из класса #4
Цитата Сообщение от oodessit Посмотреть сообщение
Есть вектор указателей, объявленный в main()
Цитата Сообщение от oodessit Посмотреть сообщение
Необходимо создать класс для работы с ним.
Это задание такое, или это вам нужно?
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
04.09.2013, 03:04  [ТС]     Работа с вектором из класса #5
задание

и в main уже тоже объявлены объекты, которые необходимо хранить в векторе

проблема в том, что мне не понятно, как написать конструктор и методы для работы с этим вектором
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.09.2013, 03:20     Работа с вектором из класса #6
Цитата Сообщение от oodessit Посмотреть сообщение
проблема в том, что мне не понятно, как написать конструктор и методы для работы с этим вектором
А мне не понятен смысл создания такого класса. При создании класса, всё идёт от типа данных, а не от методов. Если класс - это вектор указателей, то чем, собственно, этот тип данных отличается от, просто, вектора указателей, с которым можно работать, используя существующие методы класса вектор?
В main() у вас объявлен не объект нового класса, а объект emp существующего шаблонного класса vector. Для того, чтобы работать с таким объектом, не нужен специальный класс.
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
04.09.2013, 03:27  [ТС]     Работа с вектором из класса #7
в том-то и дело, что операции, которые мне необходимо выполнять с этим вектором не описаны в стандартных библиотеках. Изначально я сделал так, как Вы советуете, но мне вернули со словами, цитирую: "всю логику которая у тебя есть в функции main тебе нужно вынести в отдельный класс"

т.е. только так и никак иначе
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.09.2013, 03:55     Работа с вектором из класса #8
Цитата Сообщение от oodessit Посмотреть сообщение
что операции, которые мне необходимо выполнять с этим вектором не описаны в стандартных библиотеках.
Какие конкретно? Что это за удивительныые операции?
Цитата Сообщение от oodessit Посмотреть сообщение
"всю логику которая у тебя есть в функции main тебе нужно вынести в отдельный класс"
Им хорошо говорить, им видна логика, а мне? В том, что вы выложили (первый пост), никакой логики вообще нет. Покажите, что делаете в main(), тогда можно что-то будет сказать.

Добавлено через 4 минуты
Цитата Сообщение от oodessit Посмотреть сообщение
Например, необходимо сохранить инфу из него в файл, а затем прочесть оттуда же.
Если вот эти операции, то для этого достаточно определить, в вашем классе Employee, методы записи\чтения в файл объектов класса, а с вектором работать через функции, или просто в main().
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
04.09.2013, 04:13  [ТС]     Работа с вектором из класса #9
вот так выглядел main. В нем масса ошибок и недоработок, но, думаю, что в нем должно происходить понятно

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
emp.push_back(&bt);
emp.push_back(&bt1);
emp.push_back(&fx);
emp.push_back(&fx1);
emp.push_back(&bt2);
 
for(int i = 0; i < 5; ++i) {
    emp[i]->wage_count();
    emp[i]->show();
}
sort(emp.begin(), emp.end(), &Employee::Comp);
cout<<"Sorted"<<endl<<endl;
for(int i = 0; i < 5; ++i) {
    emp[i]->show();
}
 
for (size_t i = emp.size() - 3; i != emp.size(); ++i) {
   emp[i]->show_id();
}
 
FILE *f;
if ((f = fopen("file.txt", "w+")) == NULL)
{printf("Error while opening/writing file.\n");
exit(1);}
 
ofstream fout("file.txt");
for (int i = 0; i< emp.size(); i++)
{fout << emp[i] << " ";}
fout.close();
 
ifstream fin;   
fin.open("file.txt");
int n;
while(fin >> n)
fin.close();
от класса Employee наследуются еще два класса(так необходимо по заданию). Сортировка по зарплате, вывод на экран, вывод последних трех id, сохранение в файл, чтение из файла
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.09.2013, 04:57     Работа с вектором из класса #10
Тут всё традиционно (если поискать по форуму, то можно найти коды): класс список работников. Через что его сделать, это дело вкуса: связанный список, вектор STL, список STL. В нём методы: добавить работника в список, удалить из списка, найти в списке, сортировать список, вывести список, записать список в файл, считать список из файла и т.д.

Добавлено через 27 минут
Посмотрел я ваш код, в другой теме. Вы в векторе указателей базового класса хотите хранить адреса объектов производных классов. Тогда можно так: создаёте класс ListEmployee, в нём поле: вектор указателей на Employee, конструктор по умолчанию. Всё что делаете в main() переносите в класс.
Цитата Сообщение от alsav22 Посмотреть сообщение
В нём методы: добавить работника в список, удалить из списка, найти в списке, сортировать список, вывести список, записать список в файл, считать список из файла и т.д.
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
04.09.2013, 05:19  [ТС]     Работа с вектором из класса #11
это я уже понял сам еще утром, спасибо )

меня интересует сам код конструктора и способ обращения к вектору в классе. Ведь не смогу же я просто ctrl+x/ctrl+v из main в класс это все дело
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
04.09.2013, 19:50     Работа с вектором из класса #12
Если по-быстрому, то как-то так (добавил к коду из другой вашей темы):
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#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;
}
 
class ListEmployee
{
    vector <Employee *> vemp;
 
public :
    void add(Employee* emp)
    {
        vemp.push_back(emp);
    }
    
    void sortList()
    {
        sort(vemp.begin(), vemp.end(), &Employee::Compirer);
    }
 
    void showList()
    {
        for(int i = 0; i < vemp.size(); ++i) 
        {
            vemp[i]->show();
        }
    }
 
    void wage_countList()
    {
        for(int i = 0; i < vemp.size(); ++i) 
        {
            vemp[i]->wage_count();
        }
    }
};
 
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);
    
    ListEmployee listemp;
    
    listemp.add(&bt);
    listemp.add(&bt1);
    listemp.add(&fx);
    listemp.add(&fx1);
 
    listemp.wage_countList();
 
    listemp.showList();
    
    listemp.sortList();
    
    cout<<"-------------------"<<endl;
    
    listemp.showList();
    
    cin.get();   
    return 0;
}
Добавлено через 16 минут
Если вы в одном списке будете хранить указатели на объекты разных классов, то хорошо бы сделать в каждом классе идентификатор класса, по которому можно будет, в общем списке, отличать объекты одного класса от другого (если, например, потребуется вывести данные работников определённого класса). И добавление работников в список можно так организовать, чтобы сначала вводились данные, а потом, в зависимости от выбранного класса, вызывался нужный конструктор.
И, по моему, раз уж список, то здесь лучше использовать std::list, а не std::vector.
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
04.09.2013, 21:18  [ТС]     Работа с вектором из класса #13
как все просто оказалось )
oodessit
0 / 0 / 0
Регистрация: 21.08.2013
Сообщений: 36
07.09.2013, 15:56  [ТС]     Работа с вектором из класса #14
изменил способ добавления объектов вектор на:

C++
1
listemp.add(new EmplByTimeWage("Vasya", 1, 5.0));
но теперь при выводе на экран на месте const string выдает пустые места, а на месте double числа типа -9.22596е+061. Причем у каждого объекта одни и те же. В чем может быть проблема ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 22:35     Работа с вектором из класса
Еще ссылки по теме:

C++ задание с вектором
Работа с вектором C++
Работа с полями класса C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
07.09.2013, 22:35     Работа с вектором из класса #15
Что за EmplByTimeWage?
Yandex
Объявления
07.09.2013, 22:35     Работа с вектором из класса
Ответ Создать тему
Опции темы

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