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

Перегрузка оператора индексации для класса плохо себя ведёт - C++

Восстановить пароль Регистрация
 
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 15:28     Перегрузка оператора индексации для класса плохо себя ведёт #1
Собственно, есть такое дело.
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
#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
//не-важно-что
class word
{
    public:
        string en_name;
        //no more code yet
};
//не-важно-что
class base
{
    public:
//не-важно-что
        vector <word> _b;
        word get(unsigned int n)
        {
            return _b[n];
        }
//не-важно-что
        word operator [] (unsigned int n)
        {
            return get(n);
        }
};
//не-важно-что
Проблема в том что вот в таком виде оно работает для получения значения элемента в базе, но изменять этот элемент никоим образом не получится. Пытался решить вставкой "&" (как сказано в моём справочнике по ООП)... Ну в общем, не заработало оно. Кто подскажет? Тестил на g++.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 15:28     Перегрузка оператора индексации для класса плохо себя ведёт
Посмотрите здесь:

Перегрузка оператора индексации [] C++
Перегрузка оператора индексации [] C++
Перегрузка оператора индексации и присваивания (C++) C++
Перегрузка оператора индексации C++
Перегрузка оператора индексации для связанного списка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
19.11.2013, 15:52     Перегрузка оператора индексации для класса плохо себя ведёт #2
Надеюсь это поможет

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
#include <iostream>
#include <string>
#include <vector>
 
class base
{
    public:
        std::vector < std::string > _b;
        void push(std::string str) { _b.push_back(str); }
 
        std::string & operator [] (const unsigned int n) 
        { 
             return n < _b.size() ? _b[n] : *(new std::string("none"));
        }
        
        int size() { return _b.size(); }
        
};
 
 
int main(int argc, char *argv[])
{
    base b;
    b.push("Hello");
    b.push("world,");
    b.push("my");
    b.push("world.");
    
    b[2] = "your";
     
    for(int i = 0; i < b.size(); ++i)
        std::cout << b[i] << " ";
        std::cout << std::endl;
    
    system("PAUSE");
    return 0;
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
19.11.2013, 15:55     Перегрузка оператора индексации для класса плохо себя ведёт #3
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
class base
{
 
public:
    word& get(size_t n)
    {
        return _b[n];
    }
 
    word get(size_t n) const
    {
        return _b[n];
    }
 
    word& operator [] (size_t n)
    {
        return get(n);
    }
 
    word operator [] (size_t n) const
    {
        return get(n);
    }
 
private:
    std::vector<word> _b;
Добавлено через 1 минуту
п.с. Постеру сверху советую подумать насчет new
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
19.11.2013, 16:16     Перегрузка оператора индексации для класса плохо себя ведёт #4
stima, а почему константный метод возвращает копию, а не константную ссылку?
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 16:18  [ТС]     Перегрузка оператора индексации для класса плохо себя ведёт #5
Цитата Сообщение от stima Посмотреть сообщение
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
class base
{
 
public:
    word& get(size_t n)
    {
        return _b[n];
    }
 
    word get(size_t n) const
    {
        return _b[n];
    }
 
    word& operator [] (size_t n)
    {
        return get(n);
    }
 
    word operator [] (size_t n) const
    {
        return get(n);
    }
 
private:
    std::vector<word> _b;
Добавлено через 1 минуту
п.с. Постеру сверху советую подумать насчет new
Очень странно. В прошлый раз так же делал - не компилировалось (см. пост 1). Ну да ладно, главное что работает.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
19.11.2013, 16:26     Перегрузка оператора индексации для класса плохо себя ведёт #6
Цитата Сообщение от Tulosba Посмотреть сообщение
stima, а почему константный метод возвращает копию, а не константную ссылку?
Согласен. Подправил

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
class base
{
 
public:
    word& get(size_t n)
    {
        return _b[n];
    }
 
    const word& get(size_t n) const
    {
        return _b[n];
    }
 
    word& operator [] (size_t n)
    {
        return get(n);
    }
 
    const word& operator [] (size_t n) const
    {
        return get(n);
    }
 
private:
    std::vector<word> _b;
};
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 16:55     Перегрузка оператора индексации для класса плохо себя ведёт
Еще ссылки по теме:

перегрузка оператора индексации в списке C++
Перегрузка оператора индексации в одном классе и использование в другом C++
Перегрузка оператора ( ) для объектов класса C++

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

Или воспользуйтесь поиском по форуму:
k1-801
 Аватар для k1-801
4 / 4 / 2
Регистрация: 07.01.2013
Сообщений: 135
19.11.2013, 16:55  [ТС]     Перегрузка оператора индексации для класса плохо себя ведёт #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
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
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <math.h>
#include <fstream>
using namespace std;
 
class word
{
    public:
        string en_name;
        //no more code yet
};
 
bool __base_sort_word_comparator(word _f, word _s)
{
    return _f.en_name<_s.en_name;
}
 
class base
{
    public:
        char *base_filename;
        fstream b_file;
        vector <word> _b;
        bool load(char* _b_filename)
        {
            base_filename=_b_filename;
            b_file.open(base_filename);
            if(b_file)
            {
                //here is scanning code;
            }
            return (b_file);
        }
        word& get(unsigned int n)
        {
            return _b[n];
        }
        void clear()
        {
            _b.clear();
            b_file.close();
            return;
        }
        void reload()
        {
            _b.clear();
            return;
        }
        long long size()
        {
            return _b.size();
        }
        void sort()
        {
            std::sort(_b.begin(),_b.end(),__base_sort_word_comparator);
            return;
        }
        void save(char *s_fn)
        {
            ofstream s_file;
            s_file.open(s_fn);
            long long i;
            for(i=0;i<_b.size();i++)
                s_file<<0;
            s_file.close();
            return;
        }
        void save()
        {
            save(base_filename);
            return;
        }
        word& operator [] (unsigned int n)
        {
            return get(n);
        }
};
Yandex
Объявления
19.11.2013, 16:55     Перегрузка оператора индексации для класса плохо себя ведёт
Ответ Создать тему
Опции темы

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