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

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

Восстановить пароль Регистрация
 
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
30.09.2012, 11:27     перезагрузка operator + #1
есть самописный класс 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++
Перезагрузка operator == C++
C++ operator <<
operator char() или operator int() C++
Перезагрузка операторов "неоднозначный operator" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
30.09.2012, 11:32     перезагрузка operator + #2
Ну и перегрузите его для (const char* lhs, const String& rhs)
m1Rr0r
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
30.09.2012, 11:41  [ТС]     перезагрузка operator + #3
Цитата Сообщение от soon Посмотреть сообщение
Ну и перегрузите его для (const char* lhs, const String& rhs)
binary 'operator +' has too many parameters
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 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
 Аватар для m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,213
Завершенные тесты: 2
30.09.2012, 11:46  [ТС]     перезагрузка operator + #5
все разобрался, всем спасибо)
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 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
 Аватар для soon
2536 / 1301 / 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 +
Еще ссылки по теме:

C++ Expected init-declarator before "operator".expected `,' or `;' before "operator"
Operator = C++
Реализация operator + через operator += C++

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

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

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