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

Перегрузка оператора [] - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Serg_GR
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
13.08.2012, 09:34     Перегрузка оператора [] #1
Создал класс в котором массив указателей на другой класс, перегрузил оператор взятия индекса []
следующим образом:
h-файл
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef HIM_TABL_H
#define HIM_TABL_H
#include "him_elem.h"
class him_tabl
{
    him_elem **m_Tablica;
    int size;
public:
    him_tabl(int cntElm);
    int getSize();
    void tabSave();
    him_elem* operator [](int index);
    ~him_tabl();
};
 
#endif // HIM_TABL_H
cpp-файл
C++ (Qt)
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
#include "him_tabl.h"
#include "io_elm.h"
#include <QDebug>
 
him_tabl::him_tabl(int cntElm)
{
    m_Tablica = new him_elem*[cntElm];
    int j = 0;
    bool isElem;
    io_elm tabFile("him_tab.dat","Read");
    for(int i = 0; i < cntElm; i++)
    {
        m_Tablica[i] = new him_elem();
        isElem = tabFile.fin(m_Tablica[i]);
        if(isElem) j++;
        else break;
    }
    size = j;
}
him_tabl::~him_tabl()
{
    delete []m_Tablica;
}
him_elem *him_tabl::operator [](int index)
{
    if(index < 0 && index >= size)
        qDebug() << "Him table out of index";
    return m_Tablica[index];
}
int him_tabl::getSize()
{
    return size;
}
void him_tabl::tabSave()
{
    io_elm tabFile("him_tab.dat","ReWrite");
    for(int i = 0; i < size; i++)
    {
         tabFile.fout(m_Tablica[i]);
    }
}
при попытке взятия индекса в основной программе:
C++ (Qt)
1
2
3
4
5
6
    him_tabl *tabl = new him_tabl(118);
    curPos = 0;
    //Так:
    him_elem *test = *tabl[curPos];
    //Или так:
    him_elem *test = tabl[curPos];
Получаю сообщение об ошибке
test_ui.cpp:14: ошибка: C2440: инициализация: невозможно преобразовать "him_tabl" в "him_elem *"
Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
ЗАТУПИЛ!
Подскажите люди добрые, что я делаю не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.08.2012, 09:34     Перегрузка оператора []
Посмотрите здесь:

C++ Перегрузка оператора %
Перегрузка оператора = C++
Перегрузка оператора C++
C++ перегрузка оператора
C++ Перегрузка оператора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.08.2012, 09:59     Перегрузка оператора [] #2
C++
1
2
3
4
    //Так:
    him_elem *test = *tabl[curPos];
    //Или так:
    him_elem *test = tabl[curPos];
Так на какой конкретно случай ругается?
Попробуйте так:
C++
1
him_elem *test = (*tabl)[curPos];
Или вообще вызывайте оператор [] как обычную функцию, чтобы понять, где "сидит" ошибка:
C++
1
him_elem *test = tabl->operator[](curPos);
Serg_GR
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
13.08.2012, 10:06  [ТС]     Перегрузка оператора [] #3
Ругалась на оба случая!
В приведенном вами варианте (*tabl)[curPos] проходит нормально!
Спасибо!
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
13.08.2012, 10:10     Перегрузка оператора [] #4
Смысл скобок - указать порядок выполнения операции: сначала разыменовать указатель, затем приметить оператор [], который возвращает нужный тип. Без скобок получалось наоборот: сначала мы применяли оператор [] к указателю (получали бы, кстати, неизвестно что), а потом разыменовывали указатель, получая тип, на который он указывает. Отсюда и ошибка.
Serg_GR
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
13.08.2012, 10:13  [ТС]     Перегрузка оператора [] #5
Я уже понял!
Спасибо еше раз!
Yandex
Объявления
13.08.2012, 10:13     Перегрузка оператора []
Ответ Создать тему
Опции темы

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