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

Реализация класса и вектор - C++

Восстановить пароль Регистрация
 
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
14.04.2013, 14:13     Реализация класса и вектор #1
Всем привет!
test.cpp(главный файл)
Кликните здесь для просмотра всего текста
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
/*
* @pay - зарплата сотрудника
* @countEl - позиция элемента в контейнере
*/
#include <iostream>
#include <string.h>
#include "people.h"
#include "people.cpp"
#include <vector>
using namespace std;
int countEl = 0;
int pay = 0;
int flag;
int main (){
 
cout<< "Press 1 to start else 0:"<<endl;
cin>>flag;
 
if(flag == 1){
    vector<People*> v;
        while(flag == 1){
            v.push_back(new People());
            cout<< "Vvedite zarplaty"<<endl;
            cin>>pay;
            v[countEl]->SetPay(pay);
            cout<< "da 1  else 0 net"<<endl;
            cin>>flag;
            countEl++;
        }
            cout<< "SSSSSSSSSSS"<<endl;
        
}else{
 
    cout<<"Nice to meet you, bye!"<<endl;   
    return 0;}
}


Реализация класса
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
using namespace std;
 
People::People(){
    cout<<"Run"<<endl;
}
People::~People(){
    cout<<"Del"<<endl;
}


Класс:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class People{ 
   public: 
   People();
   ~People();
   void SetPay(int pay){
       this->pay=pay;}
   int get_pay(){
       return pay;}
 
   
   private:
   char name[30];
   int pay;
};



Вопрос: Мне кажется,что более красиво было бы если вся манипуляция с классом(запись полей и etc) производилась в реализации класса. Верно ли это?
Как все манипуляции правильно перекинуть в реализацию класса?

Пробовал так:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
#include "people.h"
using namespace std;
int pay;
int countEl=0;
int flag;
vector<People*> v;
People::People(){
    cout<<"Run"<<endl;
    
            cout<< "Vvedite zarplaty"<<endl;
            cin>>pay;
            v[countEl]->SetPay(pay);
            cout<< "da 1  else 0 net"<<endl;
            cin>>flag;
            countEl++;
}
People::~People(){
    cout<<"Del"<<endl;
}


но была ошибка в терминале
Bash
1
Segmentation fault (core dumped)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2013, 14:13     Реализация класса и вектор
Посмотрите здесь:

C++ реализация класса"вектор"
вектор элементов класса C++
C++ Реализация классов вектор и строка
шаблон класса вектор C++
шаблон класса вектор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.04.2013, 14:50     Реализация класса и вектор #2
Второй вариант явно менее коректный. Ваш класс People не должен иметь столько побочных эффектов в работе в виде ввода и вывода информации на экран. А вдруг кто-то захочет это делать в файл? Тогда он не сможет пользоваться вашим классом. В первом случае реализация класса никак не зависит от потоков ввода/вывода, оставьте лучше её (если выбирать из 2 указанных).
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
14.04.2013, 14:56  [ТС]     Реализация класса и вектор #3
Цитата Сообщение от Большой_Стен Посмотреть сообщение
Второй вариант явно менее коректный. Ваш класс People не должен иметь столько побочных эффектов в работе в виде ввода и вывода информации на экран. А вдруг кто-то захочет это делать в файл? Тогда он не сможет пользоваться вашим классом. В первом случае реализация класса никак не зависит от потоков ввода/вывода, оставьте лучше её (если выбирать из 2 указанных).
Спасибо за мнение! Подскажите, зачем тогда нужна реализация класса вообще? И что,например, у меня могло бы там быть?(Кроме конструктора и деконструктора)
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.04.2013, 15:02     Реализация класса и вектор #4
Интересно звучит "зачем нужна реализация класса". У вас кроме конструктора и деструктора есть аксессоры для 2 член-данных. А вообще класс People - хорошая база для наследования. У него потом могут быть наследники, например Man и Woman. Ваща программа предполагает наследование от People, виртуальные функции?
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
14.04.2013, 15:09  [ТС]     Реализация класса и вектор #5
Цитата Сообщение от Большой_Стен Посмотреть сообщение
Интересно звучит "зачем нужна реализация класса". У вас кроме конструктора и деструктора есть аксессоры для 2 член-данных. А вообще класс People - хорошая база для наследования. У него потом могут быть наследники, например Man и Woman. Ваща программа предполагает наследование от People, виртуальные функции?
С СИ и ++ начал знакомство не давно. Суть задачи: ввод значений о людях, их ЗП, ФИО и etc, потом возможно сортировка и еще пару плюх и вывод.
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.04.2013, 15:19     Реализация класса и вектор #6
ну тогда можно попробовать добавить ещё данных типа возвраст, работа, образование и т.п. А из красивого можно реализовать операторы сравнения (пригодится потом для сортировки). Например, что-то типа такого:
C++
1
2
3
4
5
6
7
8
9
class People
{
  //то что уже было
  public: 
  bool operator == (const People& right)
  {
    return this->pay==right.pay;
  }
};
Аналогично можно сделать операторы !,>,< и др. Но если вам ещё далеко до операторов, то сделайте аналогичные методы типа IsEqual, которые тоже будут возвращает значение типа bool "равны или не равны 2 объекта People". В любом случае в сортировке вам надо будет сравнивать обхекты по какому-то предикату (даже если будете использовать библиотечную std::sort).
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
14.04.2013, 15:26  [ТС]     Реализация класса и вектор #7
Цитата Сообщение от Большой_Стен Посмотреть сообщение
ну тогда можно попробовать добавить ещё данных типа возвраст, работа, образование и т.п. А из красивого можно реализовать операторы сравнения (пригодится потом для сортировки). Например, что-то типа такого:
C++
1
2
3
4
5
6
7
8
9
class People
{
  //то что уже было
  public: 
  bool operator == (const People& right)
  {
    return this->pay==right.pay;
  }
};
Аналогично можно сделать операторы !,>,< и др. Но если вам ещё далеко до операторов, то сделайте аналогичные методы типа IsEqual, которые тоже будут возвращает значение типа bool "равны или не равны 2 объекта People". В любом случае в сортировке вам надо будет сравнивать обхекты по какому-то предикату (даже если будете использовать библиотечную std::sort).
Да уж..Мне пока далеко до таких сравнений ) Спасибо за подсказки. Только пока немного не ясным остается суть файла "Реализация класса", где вызывается только конструктор и деконструктор.
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.04.2013, 16:37     Реализация класса и вектор #8
Ну вы можете вообще убрать файл, перенеся определение конструктора и деструктора в заголовочный в файл (вместе в определением метода getPay и т.п.). Да и такие конструктор и деструктор нужно только ради проверки, что они вызываются. Они же ничего не делают с объектом по сути, опять же только побочные эффекты в виде вывода информации в поток. Но если потом вы добавите конструктор, который принимает имя, фамилию, pay и т.п., да ещё и что-то с ними делает, кроме инициализации, то тогда явно нужно будет реализовать всё в отдельном .cpp (как это у вас и сейчас). Или вам не понятно, зачем нужно разбиение на .h и .cpp ?
inq
1 / 1 / 0
Регистрация: 27.06.2011
Сообщений: 32
14.04.2013, 18:34  [ТС]     Реализация класса и вектор #9
Цитата Сообщение от Большой_Стен Посмотреть сообщение
Ну вы можете вообще убрать файл, перенеся определение конструктора и деструктора в заголовочный в файл (вместе в определением метода getPay и т.п.). Да и такие конструктор и деструктор нужно только ради проверки, что они вызываются. Они же ничего не делают с объектом по сути, опять же только побочные эффекты в виде вывода информации в поток. Но если потом вы добавите конструктор, который принимает имя, фамилию, pay и т.п., да ещё и что-то с ними делает, кроме инициализации, то тогда явно нужно будет реализовать всё в отдельном .cpp (как это у вас и сейчас). Или вам не понятно, зачем нужно разбиение на .h и .cpp ?
Ага, теперь ясно.
Не могли бы вы привести пример, как выглядел бы мой конструктор, который бы принимал значения и обрабатывал их.


И в чем разница между моим сейчашним примером и вот если я напишу в классе так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
...
public:
void SetPay(int pay);
...


А в реализации так:
Кликните здесь для просмотра всего текста
C++
1
2
3
 
 void People::SetPay(int pay){
       this->pay=pay;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 19:01     Реализация класса и вектор
Еще ссылки по теме:

Вектор реализация C++
C++ Переопределение класса вектор
Реализация класса на базе класса Stack с возможностью !индексирования! C++

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

Или воспользуйтесь поиском по форуму:
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.04.2013, 19:01     Реализация класса и вектор #10
Если вы про SetPay, то здесь лучше сделать всё в одном файле. Дело в том, что если метод определяется сразу после объявления (как у вас это было раньше), то он неявно считается inline (почитайте в книгах или статьях, что это такое). Проще говоря, так лучше делать, если метод не очень крутой и , например, просто делает присваивание переменной (как у вас). Но вот если метод использует циклы, рекурсию и т.п., то придётся дробить на файлы, т.к. все методы сделать inline не получится. Раньше в BorlandC++ 3.1 нельзя было объявить inline-метод, в котором используется цикл. Но так как ваш класс People будет расти, то лучше оставить всё-таки .cpp файл к нему, пусть и пустой, вдруг появится метод, например, вывода в строковый поток всей информации о человеке - это уже никак не inline.
Yandex
Объявления
14.04.2013, 19:01     Реализация класса и вектор
Ответ Создать тему
Опции темы

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