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

Перегрузка операторов С++ - C++

Войти
Регистрация
Восстановить пароль
 
kuraiMuko
1 / 1 / 0
Регистрация: 11.01.2012
Сообщений: 32
08.02.2012, 22:07     Перегрузка операторов С++ #1
Задание: Написать код на языке С++ где реализуется перегрузка операторов.
Тематика: База данных института(студенты, аспиранты, преподаватели)
Помогите понять как и где можно использовать перегрузку операторов в моей тематике. Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
08.02.2012, 23:43     Перегрузка операторов С++ #2
перегрузка ввода, вывода к примеру
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
08.02.2012, 23:52     Перегрузка операторов С++ #3
Описание операторов очень хорошо описано здесь. Там же есть и перегрузка вроде...
А если Вас волнуют примеры...
Из тематики БД...
Даже не знаю что посоветовать)
Например можно положить 2 разные БД в один указатель))))
А потом к ним обращаться по индексу)
Например загнать в вектор или лист)
Но это извращенство.

Хотя, правда) Перегрузить оператор запроса к БД
Например
dbase << "Some query";
Потом можно вытаскивать оттуда данные))
while( dbase.next() )
dbase >> a;

Что то вроде этого
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,890
Записей в блоге: 1
09.02.2012, 10:15     Перегрузка операторов С++ #4
Цитата Сообщение от kuraiMuko Посмотреть сообщение
Задание: Написать код на языке С++ где реализуется перегрузка операторов.
Тематика: База данных института(студенты, аспиранты, преподаватели)
Помогите понять как и где можно использовать перегрузку операторов в моей тематике. Спасибо.
а что именно надо перегрузить?
go
Эксперт C++
3584 / 1364 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
09.02.2012, 14:59     Перегрузка операторов С++ #5
Цитата Сообщение от kuraiMuko Посмотреть сообщение
Тематика: База данных института(студенты, аспиранты, преподаватели)
Как вариант использовать наследование. Почитайте про это в литературе, может подобные примеры и встретите.
Цитата Сообщение от panicwassano Посмотреть сообщение
перегрузка ввода, вывода к примеру
Лично мне больше ничего на ум не приходит.
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Например можно положить 2 разные БД в один указатель))))
Вы наверное хотите сказать создать вектор указателей на базовый класс. Тогда базовый класс можно сделать абстрактным. Вот и вся задача.
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
09.02.2012, 15:52     Перегрузка операторов С++ #6
Можно перегружать операторы потокового ввода-вывода.
Пример для класса "Студент". В качестве полей -- имя и год поступления.

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
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
 
// класс интерфейс сериализуемого объекта
class Serializable {
 public:
  virtual std::ostream &serialize(std::ostream &stream) = 0;
  virtual std::istream &deserialize(std::istream &stream) = 0;
};
 
// перегрузка оператора вывода
std::ostream &operator<<(std::ostream &stream, Serializable &object) {
  return object.serialize(stream);
}
 
// перегрузка оператора ввода
std::istream &operator>>(std::istream &stream, Serializable &object) {
  return object.deserialize(stream);
}
 
// сериализуемый контейнер-обертка над сериализуемым объектом
template <class T>
class Table : public Serializable {
 public:
  typedef typename std::vector<T>::iterator Iterator;
  typedef typename std::vector<T>::const_iterator ConstIterator;
  Table() : data() {}
  Table(std::istream &stream) : data() {
    deserialize(stream);
  }
  void pushBack(const T &value) { data.push_back(value); }
  void pushFront(const T &value) { data.push_front(value); }
  Iterator erase(Iterator what) {
    return data.erase(what);
  }
  void clear() { data.clear(); }
  size_t size() { return data.size(); }
  bool empty() { return data.empty(); }
  Iterator begin() { return data.begin(); }
  Iterator end() { return data.end(); }
  ConstIterator begin() const { return data.begin(); }
  ConstIterator end() const { return data.end(); }
  virtual std::ostream &serialize(std::ostream &stream) {
    for (Iterator i = begin(); i != end(); ++i)
      stream << *i;
    return stream;
  }
  virtual std::istream &deserialize(std::istream &stream) {
    data.clear();
    while (stream.good())
      data.push_back(T(stream));
    return stream;
  }
 private:
  std::vector<T> data;
};
 
// сериализуемый объект
class Student : public Serializable {
 public:
  Student() : name_(), admissionYear_() {}
  Student(std::istream &stream) {
    deserialize(stream);
  }
  Student(std::string name, size_t admissionYear)
    : name_(name), admissionYear_(admissionYear) {}
  const std::string &getName() const { return name_; }
  size_t getAdmissionYear() const { return admissionYear_; }
  virtual std::ostream &serialize(std::ostream &stream) {
    stream << getName() << ";" << getAdmissionYear() << ";" << std::endl;
    return stream;
  }
  virtual std::istream &deserialize(std::istream &stream) {
    std::string line;
    getline(stream, line);
    std::istringstream source(line);
    getline(source, name_, ';'); // deserialize name
    std::string buffer;
    getline(source, buffer, ';'); // deserialize year
    std::stringstream(buffer) >> admissionYear_;
    return stream;
  }
 private:
  std::string name_;
  size_t admissionYear_;
};
 
int main(int argc, char *argv[]) {
  // можно читать из любого потока, в том числе, из файла
  std::stringstream source("Ivanov;2001;\nPetrov;2001;\nSidorov;2002;");
  Table<Student> students(source);
  // удаление первого объекта
  students.erase(students.begin());
  // вывод
  for (Table<Student>::Iterator i = students.begin(); i != students.end(); ++i)
    std::cout << i->getName() << std::endl;
}
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
09.02.2012, 16:01     Перегрузка операторов С++ #7
lemegeton, А почему не идет перегрузка ввода-вывода, а используется реализация интерфейса (всмысле в чем профит)?
HomeR_J_SimpsoN
59 / 59 / 2
Регистрация: 15.10.2010
Сообщений: 356
09.02.2012, 16:31     Перегрузка операторов С++ #8
хД
Автор партизанит) А тут для него стараются)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2012, 21:24     Перегрузка операторов С++
Еще ссылки по теме:

Перегрузка операторов C++
Перегрузка операторов C++
C++ Перегрузка операторов
Перегрузка операторов C++
C++ Перегрузка операторов

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

Или воспользуйтесь поиском по форуму:
lemegeton
 Аватар для lemegeton
2913 / 1342 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
09.02.2012, 21:24     Перегрузка операторов С++ #9
Цитата Сообщение от ForEveR Посмотреть сообщение
lemegeton, А почему не идет перегрузка ввода-вывода, а используется реализация интерфейса (всмысле в чем профит)?
Конечно, в данном учебном случае острой необходимости нет.

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

Особенно на этой почве отметились конструктор копирования и оператор присваивания, для которых у нас даже имеется макрос для отключения.

Не по теме:

Буквально на позапрошлой неделе один гражданин переписал оператор разыменования для базового класса итераторов в крупном проекте. Оператор был написан для каждого класса-потомка отдельно. Результат -- два дня убито на поиск бага. Плохая архитектура, конечно, виновата, но переписывать нереально -- лучше просто не трогать.

Yandex
Объявления
09.02.2012, 21:24     Перегрузка операторов С++
Ответ Создать тему
Опции темы

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