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

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

Войти
Регистрация
Восстановить пароль
 
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
#1

Перезагрузка операций - C++

08.09.2013, 23:38. Просмотров 754. Ответов 12
Метки нет (Все метки)

Всем привет, проблема в следующем...
Нужно решить задачку с книги, перезагрузить оператор '+' так что бы в операции s1= s2+s3; не изменялись s2 и s3.
Получилось только так:

s2="aaaa";
s3="bbbb";
после расчета s1= s2+s3, получается что s3="bbbb", s2="aaaabbbb" и s1="aaaabbbb".
Я думаю что присваивание начинается с права, значит сначала вычисляется s2+s3, а потом полученное передается в виде ссылки оператору = ( стандартные типы работают так), значит и тут мне надо сделать что бы возвращалось что то типа буфера который содержит (s2+s3), вопрос КАК ?)))
Как это сделать, уже сломал голову ппц ( не идет мне это ООП)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 23:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перезагрузка операций (C++):

Перезагрузка операций - C++
Всем привет, есть такая задача. Создать класс - дата с полями в закрытой части: день (1-31), месяц (1-12), год (целое число). Определить...

Перезагрузка операций - C++
Помогите выполнить задание. "Переопределить операцию для класса point таким образом, чтобы применение данной операции к экземпляру...

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

Перезагрузка операций - C++
Класс String описан следующим образом: #include <string.h> #include <conio.h> #include <iostream.h> #include <stdio.h> class...

Перезагрузка операций в классе - C++
http://storage9.static.itmages.ru/i/14/1206/s_1417871404_8955640_6c15215a22.jpg Одно из заданий учебника. У меня нет проблем как...

Перезагрузка операций в классах - C++
//Time.h #include <iostream> using namespace std; class Time { int min, sec; public: Time(){min=0;sec=0;}; Time(int m,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
08.09.2013, 23:41 #2
Цитата Сообщение от MousePro Посмотреть сообщение
вопрос КАК ?)))
Возвращай по значению.
0
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
08.09.2013, 23:48  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Возвращай по значению.
можно на примере, у меня класс строка )
П.с. Пробовал создать объект класса и вернуть объект , но потом подумал что объект удаляется при выходе из зоны видимости

Добавлено через 6 минут
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
const String &String::operator +(const String &right)
{
    String sub1;
    delete sub1.sPtr;
    sub1.length=length+right.length;
    sub1.sPtr=new char[sub1.length+1];
    strcpy(sub1.sPtr,sPtr);
    strcat(sub1.sPtr,right.sPtr);
    return sub1;
 
}
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.09.2013, 00:01 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <iterator>
#include <vector>
 
 
std::vector<int>   // по значению
operator +(std::vector<int> lhs, std::vector<int> const& rhs) {
   lhs.insert(std::end(lhs), std::begin(rhs), std::end(rhs));
   return lhs;   
}
 
 
int main() {
   std::vector<int> const lhs {1, 2, 3};
   std::vector<int> const rhs {4, 5, 6};
 
   std::vector<int> const result = lhs + rhs;
 
   for (auto value : result) {
      std::cout << value << ' ';
   }
   std::cout << std::endl;
}
http://ideone.com/gnQXIl

Добавлено через 5 минут
Цитата Сообщение от MousePro Посмотреть сообщение
но потом подумал что объект удаляется при выходе из зоны видимости
Локальный удалится, потому и надо возвращать по значению, что бы вернуть копию. Ссылки\указатели на локальные объекты возвращать нельзя.

Добавлено через 45 секунд
Цитата Сообщение от MousePro Посмотреть сообщение
C++
1
const String &String::operator +(const String &right)
C++
1
String String::operator +(const String &right) const
Добавлено через 6 минут
Цитата Сообщение от MousePro Посмотреть сообщение
C++
1
delete sub1.sPtr;
если sub1.sPtr указывает на массив, то нужен delete [].
1
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
09.09.2013, 00:03  [ТС] #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
String String::operator +(const String &right)
{
    String sub1;
    delete sub1.sPtr;
    sub1.length=length+right.length;
    sub1.sPtr=new char[sub1.length+1];
    strcpy(sub1.sPtr,sPtr);
    strcat(sub1.sPtr,right.sPtr);
    return sub1;
    
 
}
Вот так работает ))
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.09.2013, 00:05 #6
MousePro, таки советую сделать метод константным (ведь он не меняет состояния).
1
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
09.09.2013, 00:06  [ТС] #7
Цитата Сообщение от gray_fox Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <iterator>
#include <vector>
 
 
std::vector<int>   // по значению
operator +(std::vector<int> lhs, std::vector<int> const& rhs) {
   lhs.insert(std::end(lhs), std::begin(rhs), std::end(rhs));
   return lhs;   
}
 
 
int main() {
   std::vector<int> const lhs {1, 2, 3};
   std::vector<int> const rhs {4, 5, 6};
 
   std::vector<int> const result = lhs + rhs;
 
   for (auto value : result) {
      std::cout << value << ' ';
   }
   std::cout << std::endl;
}
http://ideone.com/gnQXIl

Добавлено через 5 минут

Локальный удалится, потому и надо возвращать по значению, что бы вернуть копию. Ссылки\указатели на локальные объекты возвращать нельзя.

Добавлено через 45 секунд

C++
1
String String::operator +(const String &right) const
Добавлено через 6 минут

если sub1.sPtr указывает на массив, то нужен delete [].
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
#include "iostream"
#ifndef STRING_H
#define STRING_H
 
class String
{
    
    friend  std::ostream &operator<<(std::ostream&,const String&);
    friend  std::istream &operator>>(std::istream&, String& );
public:
    String (const char* = "");
    String (const String &);
    ~ String();
    const String &operator = (const String&);
    const String operator + (const String&);
    String &operator += (const String&);
    int operator !()const;
    int operator==(const String&)const;
    int operator!=(const String&)const;
    int operator>(const String&)const;
    int operator<(const String&)const;
    int operator>=(const String&)const;
    int operator<=(const String&)const;
    char &operator[](int);
    String operator()(int,int);
    int getLength()const;
private:
    int length;
    char *sPtr;
};
#end
ппц, я с этим "+" с 6(мск) часов сижу втыкаю, как всегда, понимаю как должно работать, а вот с синтаксис страдает
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.09.2013, 00:11 #8
MousePro, можно + через += выразить:
C++
1
2
3
String operator +(String lhs, String const& rhs) {
   return lhs += rhs;
}
1
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
09.09.2013, 00:16  [ТС] #9
Цитата Сообщение от gray_fox Посмотреть сообщение
MousePro, можно + через += выразить:
C++
1
2
3
String operator +(String lhs, String const& rhs) {
   return lhs += rhs;
}
Ну там задание сделать что бы не изменяя ( как со стандартными типами)

ну а так s1+=s2; s1+=s3; это то понятно
C++
1
2
3
4
5
6
7
8
9
10
11
12
String &String::operator +=(const String &right)
{
    char *tempPtr=sPtr;
    length+=right.length;
    sPtr= new char[length+1];
    assert(sPtr!=0);
    strcpy(sPtr,tempPtr);
    strcat(sPtr,right.sPtr);
    delete [] tempPtr;
    return *this;
 
}
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.09.2013, 00:20 #10
Цитата Сообщение от MousePro Посмотреть сообщение
Ну там задание сделать что бы не изменяя
Что "не меняя"? Там не изменяются аргументы операции. Вообщем как хочешь, моё дело предложить...
Цитата Сообщение от MousePro Посмотреть сообщение
C++
1
#include "iostream"
:/ <iostream> же
1
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
09.09.2013, 00:28  [ТС] #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Что "не меняя"? Там не изменяются аргументы операции. Вообщем как хочешь, моё дело предложить...

:/ <iostream> же
Не меняя значение s2 и s1 в операции s3=s2+s1;

Я решаю все задачки с книги
0
gray_fox
What a waste!
1520 / 1223 / 70
Регистрация: 21.04.2012
Сообщений: 2,560
Завершенные тесты: 3
09.09.2013, 00:31 #12
Цитата Сообщение от MousePro Посмотреть сообщение
Не меняя значение s2 и s1 в операции s3=s2+s1;
Ну они там и не изменятся.
0
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
09.09.2013, 00:32  [ТС] #13
Цитата Сообщение от gray_fox Посмотреть сообщение
Ну они там и не изменятся.
Я понимаю, но я не понимал как написать + так что бы было так как задумано, вот и сидел думал...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 00:32
Привет! Вот еще темы с ответами:

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100 - C++
Вычисления проводятся слева-направо, ни одна операция не имеет приоритета. Добавлено через 2 минуты задача вынесла моск, прошу помочь

Перезагрузка операций и функции в С++ - C++
у меня есть лаба по перезагрузке. Строка символов. Реализовать операции: сравнение строк (операция = =); удаления из строки...

перезагрузка >> - C++
Учусь по книге Дейтела. Дошел до перезагрузки &gt;&gt; и &lt;&lt;. И мне интересно зачем в этом примере ignore(); Может кто-то объяснить зачем он в...

Перезагрузка - C++
Здравствуйте! Получил вот такую лабу по перезагрузке. Класс: Множество целых чисел. Поля: Количество элементов в множестве, указатель...


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

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

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