Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 11.01.2012
Сообщений: 32
1

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

08.02.2012, 22:07. Показов 1527. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание: Написать код на языке С++ где реализуется перегрузка операторов.
Тематика: База данных института(студенты, аспиранты, преподаватели)
Помогите понять как и где можно использовать перегрузку операторов в моей тематике. Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.02.2012, 22:07
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Перегрузка операторов
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора...

Перегрузка операторов /=, +=, -=
Добрый день. Есть 3 дроби F1, F2, F3 и нужно перегрузить оператор /=, у меня это выглядит так: ...

перегрузка операторов
Товарисссчи, что значит запись: CVector2D::operator+(CVector2D const& v1)const файл *срр и чем...

8
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
08.02.2012, 23:43 2
перегрузка ввода, вывода к примеру
0
60 / 60 / 8
Регистрация: 15.10.2010
Сообщений: 356
08.02.2012, 23:52 3
Описание операторов очень хорошо описано здесь. Там же есть и перегрузка вроде...
А если Вас волнуют примеры...
Из тематики БД...
Даже не знаю что посоветовать)
Например можно положить 2 разные БД в один указатель))))
А потом к ним обращаться по индексу)
Например загнать в вектор или лист)
Но это извращенство.

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

Что то вроде этого
0
139 / 60 / 13
Регистрация: 04.09.2011
Сообщений: 1,956
Записей в блоге: 1
09.02.2012, 10:15 4
Цитата Сообщение от kuraiMuko Посмотреть сообщение
Задание: Написать код на языке С++ где реализуется перегрузка операторов.
Тематика: База данных института(студенты, аспиранты, преподаватели)
Помогите понять как и где можно использовать перегрузку операторов в моей тематике. Спасибо.
а что именно надо перегрузить?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
09.02.2012, 14:59 5
Цитата Сообщение от kuraiMuko Посмотреть сообщение
Тематика: База данных института(студенты, аспиранты, преподаватели)
Как вариант использовать наследование. Почитайте про это в литературе, может подобные примеры и встретите.
Цитата Сообщение от panicwassano Посмотреть сообщение
перегрузка ввода, вывода к примеру
Лично мне больше ничего на ум не приходит.
Цитата Сообщение от HomeR_J_SimpsoN Посмотреть сообщение
Например можно положить 2 разные БД в один указатель))))
Вы наверное хотите сказать создать вектор указателей на базовый класс. Тогда базовый класс можно сделать абстрактным. Вот и вся задача.
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
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;
}
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.02.2012, 16:01 7
lemegeton, А почему не идет перегрузка ввода-вывода, а используется реализация интерфейса (всмысле в чем профит)?
0
60 / 60 / 8
Регистрация: 15.10.2010
Сообщений: 356
09.02.2012, 16:31 8
хД
Автор партизанит) А тут для него стараются)
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
09.02.2012, 21:24 9
Цитата Сообщение от ForEveR Посмотреть сообщение
lemegeton, А почему не идет перегрузка ввода-вывода, а используется реализация интерфейса (всмысле в чем профит)?
Конечно, в данном учебном случае острой необходимости нет.

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

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

Не по теме:

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

0
09.02.2012, 21:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2012, 21:24
Помогаю со студенческими работами здесь

Перегрузка операторов
Всем привет. Читаю Страуструпа, дошел до перегрузки операторов и наткнулся там вот на такое...

Перегрузка операторов
Есть у меня свой тип рациональных дробей, и вот мне надо перегрузить оператор &quot;+&quot; таким образом,...

Перегрузка операторов
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора...

перегрузка операторов
Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса. Первый: Чем отличается...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru