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

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

Войти
Регистрация
Восстановить пароль
 
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,256
Завершенные тесты: 2
#1

перезагрузка operator + - C++

30.09.2012, 11:27. Просмотров 351. Ответов 7
Метки нет (Все метки)

есть самописный класс String;
в нем определены операторы + для,
C++
1
2
3
String + String
String + char
String + *char
для вывода в поток и опер равно.

собственно вопрос вот в чем:

C++
1
2
String str1 = "string 1";
String str1 = "string 2";
понятно если char * будет справа от выражения, то все в порядке
C++
1
cout << str1 + str2 + "some str " << endl;
как быть в таком случае, если выражение выглядит:
C++
1
cout << "some str " + str1 + str2 << endl;
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.09.2012, 11:27     перезагрузка operator +
Посмотрите здесь:

Перезагрузка operator - - C++
Есть одна задача : Одномерный массив а и b. Класс одномерный массив. Реализовать для объектов данного класса перезагрузку операции -...

Перезагрузка operator == - C++
Тренируюсь и пишу клас комплексных чисел. Проблема с перезагнрузкой оператора сравнения да и другие перезагрузки не хотят использоваться....

Перезагрузка операторов "неоднозначный operator" - C++
Не знаю в ту ли группу пишу, но все же.... Для моего класса есть несколько операторов присвоения const MyStr&amp; operator +=(const MyStr&amp;...

Operator= - C++
Добрый день. Имеется необходимость создать объект от родительского класса, а затем его наследнику присвоить объект другого типа. ...

operator - C++
Всем привет, опять непонятка в книге, дошел до оператора operator и ничего не понял, для чего он нужен, что он делает, то есть как он...

operator= - C++
Такой вопрос. Есть объект. Хочу чтобы при присваивании его к чеслу выдавалось число. Например. class MyClass { short...

Operator*=(); - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace::std; class Distance //Класс английских длин { ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.09.2012, 11:32     перезагрузка operator + #2
Ну и перегрузите его для (const char* lhs, const String& rhs)
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,256
Завершенные тесты: 2
30.09.2012, 11:41  [ТС]     перезагрузка operator + #3
Цитата Сообщение от soon Посмотреть сообщение
Ну и перегрузите его для (const char* lhs, const String& rhs)
binary 'operator +' has too many parameters
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
30.09.2012, 11:41     перезагрузка operator + #4
лучше всего перегрузить String operator+ (const String& s1, const String& s2);
и реализовать String(const char* ptr)
тогда автоматически все выражения вида const char* + String, String + const char* будут прокатывать
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,256
Завершенные тесты: 2
30.09.2012, 11:46  [ТС]     перезагрузка operator + #5
все разобрался, всем спасибо)
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
30.09.2012, 11:55     перезагрузка operator + #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
100
101
102
103
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
 
class String
{
public:
    String();
    String(const char* instance);
    String(const String& instance);
    ~String();
    
    const String& operator= (const String& instance);
    
    friend String operator+ (const String& s1, const String& s2);
    friend std::ostream& operator<< (std::ostream& stream, const String& instance);
    
    unsigned int length() const;
    
private:
    char* data;
    unsigned int size;
};
 
String::String() :
    data(), size()
{
}
 
String::String(const String& instance) :
    size(instance.size)
{
    data = new char[size + 1];
    for (unsigned int i = 0; i < size; ++i)
        data[i] = instance.data[i];
    data[size] = NULL;
}
 
String::String(const char* instance) :
    size(static_cast<unsigned int >(strlen(instance)))
{
    data = new char[size + 1];
    for (unsigned int i = 0; i < size; ++i)
        data[i] = instance[i];
    data[size] = NULL;
}
 
String::~String()
{
    if (data)
    {
        delete[]data;
        data = NULL;
    }
}
 
unsigned int String::length() const
{
    return size;
}
 
const String& String::operator= (const String& instance)
{
    if (data)
        delete[]data;
    
    size = instance.size;
    data = new char[size + 1];
    for (unsigned int i = 0; i < size; ++i)
        data[i] = instance.data[i];
    data[size] = NULL;
    
    return *this;
}
 
String operator+ (const String& s1, const String& s2)
{
    String s;
    s.size = s1.size + s2.size;
    s.data = new char[s.size + 1];
    for (unsigned int i = 0; i < s1.size; ++i)
        s.data[i] = s1.data[i];
    for (unsigned int i = 0; i < s2.size; ++i)
        s.data[i + s1.size] = s2.data[i];
    s.data[s.size] = NULL;
    return s;
}
 
std::ostream& operator<< (std::ostream& stream, const String& instance)
{
    return stream << instance.data;
}
 
int main()
{
    String s("32323");
    const char* ptr = "vfdvfd";
    std::cout << (ptr + s) << std::endl;
    std::cout << (s + ptr) << std::endl;
    return EXIT_SUCCESS;
}
example)
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.09.2012, 12:29     перезагрузка operator + #7
Цитата Сообщение от sandye51 Посмотреть сообщение
лучше всего
Я бы не сказал, что это "лучше всего". Это быстрее написать, но программа будет медленнее работать, поскольку будут создаваться временные объекты. С другой стороны, если использовать несколько перегрузок, потребуется перевыделение памяти, поэтому нужен хороший аллокатор. Так что палка о двух концах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2012, 12:31     перезагрузка operator +
Еще ссылки по теме:

operator >> - C++
// 1.h #ifndef STONEWT_H_ #define STONEWT_H_ using std::cout; using std::cin; using std::endl; class Stonewt { private: ...

operator() - C++
Здраваствуйте. Объясните пожалуйста смысл &quot;opereator()&quot; во всех случаях, что он делает, почему иногда впереди него ставится &quot;&amp;&quot;...

operator++ - C++
Всем доброго времени суток. Вот сделал перегрузку оператора ++ TAvia TAvia::operator++() { TAvia temp; temp.year=this-&gt;year+1; ...

operator = - C++
Посмотрите, пожалуйста, ато я саафсем запарилась... %) Проблема такая: есть класс, у которого есть функция присваивания: class...

operator[] - C++
есть класс CItem, в качестве члена указан список CList&lt;CVariant&gt; data; как будет выглядеть operator класса CItem, чтобы данный код...


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

Или воспользуйтесь поиском по форуму:
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
30.09.2012, 12:31     перезагрузка operator + #8
soon, согласен.
"Лучше всего" я имел ввиду с точки зрения быстрого написания и избыточности кода
Yandex
Объявления
30.09.2012, 12:31     перезагрузка operator +
Ответ Создать тему
Опции темы

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