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

Кто-нибудь может переделать задачу со структур на классы? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вычислить сумму чисел, порядковые номера которых являются числами Фибоначчи. http://www.cyberforum.ru/cpp-beginners/thread615609.html
Всем привет! помогите с задачкой! заранее спасибо.! Вычислить сумму чисел, порядковые номера которых являются числами Фибоначчи.
C++ Циклы, подскажите пожалуста По условию задачи нужно вычислить выражение, при вводе необходимых данных с клавиатуры. Задача выглядит следующим образом Дан корень, по корнем единица корень третей степени из двух плюс корень n-ой... http://www.cyberforum.ru/cpp-beginners/thread615592.html
C++ Сортировка слов в строке в лексикографическом порядке (по алфавиту)
Как отсортировать слова в строке в лексикографическом порядке (по алфавиту)?Помогите , пожалуйста.
Возврат char* через return C++
Вот написал маленький пример, того с чем не могу разобраться в большой программе: char *filename; FILE *fd; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new...
C++ Удаление строки/столбца матрицы http://www.cyberforum.ru/cpp-beginners/thread615553.html
поиск юзал. сабж. void fun(int **&array, int &row, int col) { int sum = 0; int count = 0; for(int i = 0; i < row; i++) { for(int j = 0; j < col; j++) { sum += array; }
C++ Внедрение в процесс я знаю всего 2 способа как перехватить api dll. 1. это поменять код исполняемой dll. 2. или поменять таблицу импорта в исполняемом ексе... у меня есть прога proxifier называется она както... подробнее

Показать сообщение отдельно
MrGluck
Модератор
Эксперт CЭксперт С++
7497 / 4613 / 694
Регистрация: 29.11.2010
Сообщений: 12,631
28.06.2012, 17:37
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
#include <iostream>
#include <string>
 
class Zodiac
{
  private:
    std::string name, surname, sign; // объявляем поля класса
    int day, month, year;
    bool empty; // это поле класса отвечает за "заполненность" Т.е. если класс проинициализирован, то она равна false, иначе true.
  public:
    Zodiac(){empty = true;} // объявляем конструктор по умолчанию
    Zodiac(std::string n, std::string s, std::string z, int a, int b, int c): // объявляем аргументированный конструктор и ицициализируем его
            name(n), surname(s), sign(z), day(a), month(b), year(c){empty = false; }
    void fill(std::string n, std::string s, std::string z, int a, int b, int c); // объявляем функцию, которая заполняет поля класса
    std::string getSurname() const {return surname; } // функция возвращает фамилию (получаем доступ)
    bool operator< (const Zodiac &); // оператор для сравнения (пригодиться в сортировке. Т.к. класс не POD тип, то компилятору нужно указать, что является больше, а что меньше)
    friend std::ostream& operator<< (std::ostream &, const Zodiac &); // дружественная функция вывода объекта в поток. Дружественные функции получают доступ к private-членам
};    
 
int main()
{
    const std::size_t N = 8; // объявляем массив размера как константу
    Zodiac z[N]; // объявляем массив объектов класса Zodiak. Но не инициализируем их.
    std::size_t counter = 0; // счетчик на 0. Будет отвечать за кол-во заполненных элементов 
    for (int i=0; i < 2; i++)
    {    
        std::string name, surname, sign;
        int day, month, year;
        std::cout<< "Enter name: "; std::cin>> name;
        std::cin.ignore(); // при нажатии Enter в потоке остается символ '/n' И если его не игнорировать, то он и запишется в переменную типа std::string при след. считывании, т.к. она ожидает этого символа в потоке.
        std::cout<< "Enter surname: "; std::cin>> surname;
        std::cin.ignore();
        std::cout<< "Enter sign: "; std::cin>> sign;
        std::cin.ignore();   
        std::cout<< "Enter DOB: "; std::cin>> day>> month>> year; // последовательно считываем день, месяц, год
        z[counter++].fill(name, surname, sign, day, month, year); // вызываем метод fill и передаем ему считаные аргументы в качестве параметра. Метод вызывается у объекта класса с индексом counter (добавление идет в конец). Увеличиваем счетчик на 1.
    }
    std::string key; // ключ, по которому будем искать нужный объект
    std::cout<< "Enter key: "; std::cin>> key;
    for (std::size_t i=0; i < counter; i++)
    //    std::cout<< z[i];
        if (z[i].getSurname() == key) std::cout<<z[i];    
    return 0;
}
 
void Zodiac::fill (std::string n, std::string s, std::string z, int a, int b, int c)
{
    name = n;
    surname = s;
    sign = z;
    day = a;
    month = b;
    year = c;
    empty = false;
}
 
bool Zodiac::operator< (const Zodiac &z)
{
     if (z.year != year) // если год нашего объекта не равен году сравниваемого
         return year < z.year;
     if (z.month != month)
         return month < z.month;
     return day < z.day; // вернет истину, если day < z.day
}
 
std::ostream& operator<< (std::ostream &out, const Zodiac &z) // возвращает ссылку на поток ostream
{
    if (z.empty) return out; // если объект не проинициализирован (или просто его поле empty == true), то возвращаем пустой поток
    out<< "Name: "<< z.name<< std::endl // формируем поток
       << "Surname: "<< z.surname<< std::endl
       << "Sign: "<< z.sign<< std::endl
       << "DOB: "<< z.day<< " "<< z.month<< " "<< z.year<< std::endl<< std::endl;
    return out; // возвращаем поток
}
можно в начале программы написать using namespace std;
лично мне это неудобно, я предпочитаю указывать полное имя функции. Впрочем, подробнее можно почитать тут: http://www.cyberforum.ru/blogs/34326/blog275.html
В малых проектах не имеет большой роли, хоть и может иногда привести к конфликту имен.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.