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

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

Восстановить пароль Регистрация
 
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
08.09.2013, 23:38     Перезагрузка операций #1
Всем привет, проблема в следующем...
Нужно решить задачку с книги, перезагрузить оператор '+' так что бы в операции s1= s2+s3; не изменялись s2 и s3.
Получилось только так:

s2="aaaa";
s3="bbbb";
после расчета s1= s2+s3, получается что s3="bbbb", s2="aaaabbbb" и s1="aaaabbbb".
Я думаю что присваивание начинается с права, значит сначала вычисляется s2+s3, а потом полученное передается в виде ссылки оператору = ( стандартные типы работают так), значит и тут мне надо сделать что бы возвращалось что то типа буфера который содержит (s2+s3), вопрос КАК ?)))
Как это сделать, уже сломал голову ппц ( не идет мне это ООП)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
08.09.2013, 23:41     Перезагрузка операций #2
Цитата Сообщение от MousePro Посмотреть сообщение
вопрос КАК ?)))
Возвращай по значению.
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;
 
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 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 [].
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;
    
 
}
Вот так работает ))
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.09.2013, 00:05     Перезагрузка операций #6
MousePro, таки советую сделать метод константным (ведь он не меняет состояния).
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(мск) часов сижу втыкаю, как всегда, понимаю как должно работать, а вот с синтаксис страдает
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.09.2013, 00:11     Перезагрузка операций #8
MousePro, можно + через += выразить:
C++
1
2
3
String operator +(String lhs, String const& rhs) {
   return lhs += rhs;
}
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;
 
}
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.09.2013, 00:20     Перезагрузка операций #10
Цитата Сообщение от MousePro Посмотреть сообщение
Ну там задание сделать что бы не изменяя
Что "не меняя"? Там не изменяются аргументы операции. Вообщем как хочешь, моё дело предложить...
Цитата Сообщение от MousePro Посмотреть сообщение
C++
1
#include "iostream"
:/ <iostream> же
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
09.09.2013, 00:28  [ТС]     Перезагрузка операций #11
Цитата Сообщение от gray_fox Посмотреть сообщение
Что "не меняя"? Там не изменяются аргументы операции. Вообщем как хочешь, моё дело предложить...

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

Я решаю все задачки с книги
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
09.09.2013, 00:31     Перезагрузка операций #12
Цитата Сообщение от MousePro Посмотреть сообщение
Не меняя значение s2 и s1 в операции s3=s2+s1;
Ну они там и не изменятся.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 00:32     Перезагрузка операций
Еще ссылки по теме:

C++ Перезагрузка
C++ Перезагрузка операций в классах
C++ Перезагрузка операций в классе

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

Или воспользуйтесь поиском по форуму:
MousePro
49 / 30 / 1
Регистрация: 25.04.2013
Сообщений: 366
09.09.2013, 00:32  [ТС]     Перезагрузка операций #13
Цитата Сообщение от gray_fox Посмотреть сообщение
Ну они там и не изменятся.
Я понимаю, но я не понимал как написать + так что бы было так как задумано, вот и сидел думал...
Yandex
Объявления
09.09.2013, 00:32     Перезагрузка операций
Ответ Создать тему
Опции темы

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