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

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

Войти
Регистрация
Восстановить пароль
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

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

23.03.2013, 12:56. Просмотров 608. Ответов 9
Метки нет (Все метки)

Здорова!
Нужно перегрузить в классе 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов функции с левой стороны от операции присваивания (C++):

Операции присваивания - C++
Как можно проиллюстрировать возможности операций присваивания на примере программы?

Переопределение операции присваивания - C++
Есть вот такой класс: #ifndef cd_h #define cd_h class Cd { private: char* performance; char* label; int selections;

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

Перегрузка операции присваивания и сложения - C++
Необходимо составить описание класса для определения одномерных массивов целых чисел. Границы индексов можно задавать произвольно, т.е....

Присваивание указателей, вызов оператора присваивания класса - C++
Если написать StrL **testStr; testStr = new StrL * ; testStr = new StrLBit("100001"); testStr = new StrLBit("0101"); testStr =...

Создаются ли копии объектов при операции присваивания? - C++
Доброго времени суток! Допустим есть объекты одного класса a1, a2, a3. Насколько я понимаю, при операции присваивания a1=a2 создаётся...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
DiffEreD
1430 / 767 / 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
2610 / 1832 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
23.03.2013, 14:03 #3
Функция вернет результат во временной безымянной переменной, которая сразу же используется (присвоение, участие в выражении) и исчезает. Присвоить возвращаемой переменной что-нибудь, наверно, можно, если компилятор позволит. Но смысла в этом нет, поскольку эта переменная сразу же исчезнет. Смысл появится, если функция возвращает ссылку. Тогда присваивание временной переменной будет означать присваивание реальной переменной в программе.
ninja2
231 / 187 / 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
2610 / 1832 / 262
Регистрация: 08.06.2007
Сообщений: 6,989
Записей в блоге: 4
24.03.2013, 11:37 #5
Если вы вернете подстроку в виде строки, то этот объект не будет содержать информации об объемлющей строке. Если вам придется раздвигать или сдвигать символы объемлющей строки, то у функции operator= не будет для этого информации. Отсюда вывод: Класс строка должен содержать информацию об объемлющей строке, либо должен быть разработан специальный класс "подстрока".
ninja2
231 / 187 / 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
4286 / 1408 / 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
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
24.03.2013, 14:10  [ТС] #8
Конечно можно но условие задачи через присваивание, чтобы с левой стороны было. Та я уже сделал, так как написал выше.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
24.03.2013, 14:40 #9
Цитата Сообщение от ninja2 Посмотреть сообщение
Все решил как решил, главное работает.
ну дык выложи решение сюда
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
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;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 07:28
Привет! Вот еще темы с ответами:

После использования операции присваивания ошибку выдает само удаление файла - C++
У меня есть шаблон. Его принцип работы как ArrayList из java. Но есть проблема с удалением нетипизированого массива или с операцией...

Не используя никаких операций, кроме умножения и присваивания, составить программу, вычисляющую a7 за 4 операции умножения - C++
1.Дано число a. Не используя никаких операций, кроме умножения и присваивания, составить программу, вычисляющую a7 за 4 операции умножения;...

Вызов деструктора при операции над объектом - C++
разъясните, пожалуйста, почему в коде ниже деструктор вызывается при присвоении новых значений объекту после инициализации? Я так понял из...

Неявный вызов конструктора шаблонного класса при операции сравнения - C++
Реализовал шаблонный класс целых чисел, для использования его в шаблонном классе дробей. Звучит жутковасто. :D Так вот, в классе целых...


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

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

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