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

Вызов функции с левой стороны от операции присваивания - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
23.03.2013, 12:56     Вызов функции с левой стороны от операции присваивания #1
Здорова!
Нужно перегрузить в классе String операцию выделения строки, но так чтобы она стояла слева от операции присваивания например s.substr(1,3)="Hel"; где s это строка типа String. Как то так.
Мне вообще не ясно как происходит вызов?
Мб так: s.substr(1,3).operator=("Hel"); но скорее всего нет, потому что я присвою s хз что.
Мб так s.substr(1,3)="Hel"; мб как то заменить на operator=(s.substr(1,3), "Hel"), а вообще мне бы лучше было б значение передать operator=(1,3,"Hel") отак бы лучше было б токо как это сделать ???
Я вообще не пойму как его делать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.03.2013, 12:56     Вызов функции с левой стороны от операции присваивания
Посмотрите здесь:

Даны натуральные числа a и b которые определяют стороны прямоугольника.На сколько квадратов, стороны которого...... C++
C++ Не используя никаких операций, кроме умножения и присваивания, составить программу, вычисляющую a7 за 4 операции умножения
Переопределение операции присваивания C++
C++ Посмотрите описание конструктора копирования и оператора присваивания с ними все в порядке? После функции add теряются данные
Присваивание указателей, вызов оператора присваивания класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
23.03.2013, 13:53     Вызов функции с левой стороны от операции присваивания #2
Ну тут наверное зависит от того как вы реализовали substr в своем классе. Скорее всего, substr должна будет возвращать копию на строку, а уже этой строке можно присваивать что угодно. Ну как то так:
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
#include <iostream>
#include <string>
 
class String
{
    std::string str;
public:
    String(const std::string& str_): str(str_) {}
    String(const char* str_): str(str_) {}
    std::string substr(const unsigned pos = 0, const unsigned count = std::string::npos) const
    {
        return str.substr(pos, count);
    }
    void show() const {std::cout<<str<<"\n";}
};
 
int main() 
{
    String s("Discovery"); s.show();
    std::string some_string = s.substr(3);
    std::cout<<"some_string = "<<some_string<<"\n";
    s.show();
    s.substr(3) = "hello";
    s.show();
    std::cout<<"s.substr(3) = \"hello\" = "<<(s.substr(3) = "hello")<<"\n";
    return 0;
}
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
23.03.2013, 14:03     Вызов функции с левой стороны от операции присваивания #3
Функция вернет результат во временной безымянной переменной, которая сразу же используется (присвоение, участие в выражении) и исчезает. Присвоить возвращаемой переменной что-нибудь, наверно, можно, если компилятор позволит. Но смысла в этом нет, поскольку эта переменная сразу же исчезнет. Смысл появится, если функция возвращает ссылку. Тогда присваивание временной переменной будет означать присваивание реальной переменной в программе.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.03.2013, 11:31  [ТС]     Вызов функции с левой стороны от операции присваивания #4
Цитата Сообщение от yuron_477 Посмотреть сообщение
Ну тут наверное зависит от того как вы реализовали substr в своем классе. Скорее всего, substr должна будет возвращать копию на строку, а уже этой строке можно присваивать что угодно. Ну как то так:
Да нет не так от условие задачи: Разработайте класс String таким образом, чтобы операцию взятия подстроки можно было использовать в левой части операции присваивания. Сначала ограничтесь версией, где длинны подстроки и присваиваемой строки одинаковые. Затем напишите версию с разными длинами.

От допустим есть строка "Hellow world gacpada" и я пишу substr(1,3) то возвращается строка "ell" копия. Кусочек.
Это я то сделал. Но по условию задачи как я понял мне нужно чтобы при вызове substr(1,3)="bbb", строка "Hellow world gacpada" стала "Hbbbow world gacpada". Это для начала как бы упрощенный вариант присваивать строку равную substr, ну то есть "bbb" по длине равна "ell". А дальше усложнить для разных строк например при вызове substr(1,3)="PRIVET"; заменялось бы "HPRIVETow world gacpada".

От если я не ошибся, что нужно сделать, а не просто вернуть кусок строки и ей уже чо то присвоить.
Кто решал? Это задача из книги Страуструпа, для новичков хелп.

Добавлено через 3 минуты
Я от вообще не пойму как мне ссылку вернуть?
Допустим строка хранится в классе char* s;
Допустим я написал функцию substr()
C++
1
2
3
4
5
6
7
8
9
10
//peregryzka sub
    string substr(int a, int b)
    {
        string st;
        for(int i=a;i<=b;i++)
        {
            st+=s[i];
        }
        return st;
    }
Да она возвращает копию кусочек строки, а как же мне ссылку вернуть от 1 до 3 символа?,
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
24.03.2013, 11:37     Вызов функции с левой стороны от операции присваивания #5
Если вы вернете подстроку в виде строки, то этот объект не будет содержать информации об объемлющей строке. Если вам придется раздвигать или сдвигать символы объемлющей строки, то у функции operator= не будет для этого информации. Отсюда вывод: Класс строка должен содержать информацию об объемлющей строке, либо должен быть разработан специальный класс "подстрока".
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.03.2013, 13:17  [ТС]     Вызов функции с левой стороны от операции присваивания #6
operator=(), а как же она будет вызываться? Если она у меня перегружена при a=b; где а и b это объекты String, то что же тогда substr() должна вернуть сам объект?. Яж по другому не смогу операцию = перегрузить правильно ж.

Добавлено через 4 минуты
то есть при вызове substr(1,3) например где, то в классе должны сохранятся 1, 3, а затем при вызове operator= и строку, то эти значения должны проверяться и расширять либо нет кусок строки, но тода они сработают просто при вызове substr(1,3); все а зтем мы вызовем operator= и какую нить строку и все получим не то что хотели, мы например хотели полностью заменить строку, а заменим часть хз как делать. Неужели никто не решал?

Добавлено через 3 минуты
или правильно сделать для вывода подстроки одну функцию например sub, а для изменения строки substr? Ну от один из вариантов инициализировать при вызове substr переменные две которые укажут какую подстроку менять в самой строке хз.

Добавлено через 1 минуту
от например cout <<sub(1,3)<<endl; мы выведем кусок подстроки.
а при substr(1,3)="dsafasfsadfasdf"; мы ее тупо заменим, и просто так substr(1,3) без равно не будем просто вызывать и все мб так хз.

Добавлено через 2 минуты
Да наверно окончательное решение из substr() возвращать сылку на объект инициализировать в нем два числа, а затем при вызове operator= уже заменить само представление класса. ????

Добавлено через 1 час 21 минуту
Все решил как решил, главное работает.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
24.03.2013, 14:01     Вызов функции с левой стороны от операции присваивания #7
Можно и так как-то:
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
#include <iostream>
#include <string>
class String
{
    std::string str;
public:
    String (std::string x): str(x){}
    
    struct sstr
    {
        std::string bufstr;
       int p, c;
        std::string&operator() (const int& pos, const int& cnt)
        {
            this->p = pos;
            this->c = cnt;
            return bufstr;
        }
    }substr; 
     
    void show ()
    {
        int ii(0);
        for (int i=substr.p; i<=substr.c; ++i)
           str[i] = substr.bufstr [ii++];   
        
        std::cout<<str;
    } 
};
int main()
{
    String str("Hellow world gacpada");
    str.substr(1,3) = "bbb";
    str.show();
    return 0;
}
Для примера спихнул копирование в show и там же сразу вывод.

http://liveworkspace.org/code/1D6PoM$0
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.03.2013, 14:10  [ТС]     Вызов функции с левой стороны от операции присваивания #8
Конечно можно но условие задачи через присваивание, чтобы с левой стороны было. Та я уже сделал, так как написал выше.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.03.2013, 14:40     Вызов функции с левой стороны от операции присваивания #9
Цитата Сообщение от ninja2 Посмотреть сообщение
Все решил как решил, главное работает.
ну дык выложи решение сюда
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 07:28     Вызов функции с левой стороны от операции присваивания
Еще ссылки по теме:

Перегрузка операции присваивания и сложения C++
C++ Операции присваивания
C++ Переопределение операции присваивания

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2798 / 1574 / 246
Регистрация: 03.05.2010
Сообщений: 3,651
25.03.2013, 07:28     Вызов функции с левой стороны от операции присваивания #10
Вообще-то по условию задачи сам объект строки String должен изменяться.
Можно так сделать:
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/////////////////////////////////////////////////////////////////////////////////////////
//Разработайте класс String таким образом, чтобы операцию взятия подстроки можно было использовать 
//в левой части операции присваивания. Сначала ограничтесь версией, где длинны подстроки и присваиваемой 
//строки одинаковые. Затем напишите версию с разными длинами.
//
//Нужно перегрузить в классе String операцию выделения строки, но так чтобы она стояла слева 
//от операции присваивания например s.substr(1,3)="Hel"; где s это строка типа String.
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <numeric>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef T_str::size_type    T_pos;
typedef std::vector<T_str>  T_substrings;
/////////////////////////////////////////////////////////////////////////////////////////
class  String
{
    //-----------------------------------------------------------------------------------
    T_substrings    substrings_;
    //-----------------------------------------------------------------------------------
public:
    //-----------------------------------------------------------------------------------
    String( const T_str&  s )
        :
        substrings_
            (
                T_substrings(1, s)
            )
    {}
    //-----------------------------------------------------------------------------------
    operator T_str()
    {
        return  std::accumulate
                    (
                        substrings_.begin   (),
                        substrings_.end     (),
                        T_str               ()
                    );
    }
    //-----------------------------------------------------------------------------------
    T_str&  substr
        (
            T_pos   pos,
            T_pos   size
        )
    {
        T_str   s   =   *this;
 
        substrings_.clear();
 
        substrings_.push_back
            (
                s.substr
                    (
                        0,
                        pos
                    )
            );
 
        substrings_.push_back
            (
                s.substr
                    (
                        pos,
                        size
                    )
            );
 
        substrings_.push_back
            (
                s.substr( pos + size )
            );
 
        return  substrings_[1];
    }
    //-----------------------------------------------------------------------------------
};
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout   <<  "Введите строку:"
                <<  std::endl;
 
    T_str   s;
    std::cin    >>  s;
    String  my_s(s);
 
    for(;;)
    {
        std::cout   <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl
                    <<  "Введите положение подстроки в этой строке:"
                    <<  std::endl;
 
        int pos     =   0;
        std::cout   <<  "позиция:"
                    <<  '\t';
        std::cin    >>  pos;
 
        if(pos < 0)
        {
            break;
        }
 
        int size    =   0;
        std::cout   <<  "размер:"
                    <<  '\t'
                    <<  '\t';
        std::cin    >>  size;
 
        if(size < 0)
        {
            break;
        }
 
        std::cout   <<  std::endl
                    <<  "Введите новое значение для этой подстроки: ";
 
        T_str   new_substr_val;
        std::cin    >>  new_substr_val;
        my_s.substr(pos, size)  =   new_substr_val;
 
        std::cout   <<  "Строка с замененной подстрокой:"
                    <<  T_str(my_s)
                    <<  std::endl;
    }
}
Yandex
Объявления
25.03.2013, 07:28     Вызов функции с левой стороны от операции присваивания
Ответ Создать тему
Опции темы

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