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

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

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

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

14.04.2013, 14:13. Просмотров 396. Ответов 9
Метки нет (Все метки)

Всем привет!
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++
пожалусто дайти информации на эту тему... а то не могу найдти, а Лаптев&quot; Эксперт курс на С++&quot; не помогает...:wall:

Реализация класса на базе класса Stack с возможностью !индексирования! - C++
Помогите пожалуйста!!! Нужно реализовать на базе класса stack другой класс с возможностью индексирования, а именно: Например 1 - й...

Вектор реализация - C++
Ситуация такая мне нужно создать вектор игроки, каждый игрок внутри себя должен содержать вектор предметы. При по попытки создать вектор...

Составить описание класса "3D вектор". Объявить объекты класса и продемонстрировать работу методов - C++
Возникли сложности при решении задачи. Буду признателен тем, кто поможет. Задание: Составить описание класса. Объявить объекты класса...

Реализация классов вектор и строка - C++
Для лабораторной работы нужно было написать свою реализацию классов вектор и строка. Выкладываю что получилось, может, кому пригодится. ...

вектор элементов класса - C++
Подскажите пожалуйста,как сделать вектор элементов класса,особенно .push_back(?)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Большой_Стен
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;
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
14.04.2013, 19:01 #10
Если вы про SetPay, то здесь лучше сделать всё в одном файле. Дело в том, что если метод определяется сразу после объявления (как у вас это было раньше), то он неявно считается inline (почитайте в книгах или статьях, что это такое). Проще говоря, так лучше делать, если метод не очень крутой и , например, просто делает присваивание переменной (как у вас). Но вот если метод использует циклы, рекурсию и т.п., то придётся дробить на файлы, т.к. все методы сделать inline не получится. Раньше в BorlandC++ 3.1 нельзя было объявить inline-метод, в котором используется цикл. Но так как ваш класс People будет расти, то лучше оставить всё-таки .cpp файл к нему, пусть и пустой, вдруг появится метод, например, вывода в строковый поток всей информации о человеке - это уже никак не inline.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 19:01
Привет! Вот еще темы с ответами:

шаблон класса вектор - C++
В общем говоря нужно описать методы вектора и перегрузки операций. Во всех контейнерах для итераторов реализованы операции: =, ==, !=,...

шаблон класса вектор - C++
На экзамене будет задание: создать шаблонный класс вектор с возможностью вывода информации,помещения информации и обработки информации ....

Насчет класса вектор - C++
Помогите в состовлении: создать класс вектор. Члены данные класса - 3 прямоугольные декартовые координаты. Члены функции класса...

Вектор из объектов класса - C++
Добрый вечер) Подскажите пж, что не так? Вот код программы: В файле class.h: #ifndef CLASS_H_INCLUDED #define...


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

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

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