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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Serg_GR
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
#1

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

13.08.2012, 09:34. Просмотров 1677. Ответов 4
Метки нет (Все метки)

Создал класс в котором массив указателей на другой класс, перегрузил оператор взятия индекса []
следующим образом:
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++
Не могу понять: в 184 строке отказывается работать. Без нее - все нормально. Скорее всего неправильно переопределил +.... Но если...

Перегрузка оператора = - C++
Как перегрузить оператор = для char ?

Перегрузка оператора - C++
Имеется время, например 12:12:12 Перегрузка инкремента Time &amp;Time::operator ++ () { Next(); return *this; } ...

Перегрузка оператора - C++
Помогите доделать задание... Это в классе метод, осуществляющий ввод значений полей класса с клавиатуры; метод, осуществляющий...

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

Перегрузка оператора - C++
Здравствуйте. Нужна помощь) Есть такой класс: class vect { public: float *items; vect() { items = new float; for(int...

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора ++ - C++
Написал префиксную перегрузку ++ Vremya &amp;Vremya::operator ++ () { int sec = getSec(*this); //перевод в секунды ...

Перегрузка оператора [][] - C++
допустим у меня есть клас Matrix и я хочу опедилить оператор доступа к его елементу как реализовть оператор если простой масив я знаю а...

Перегрузка оператора = - C++
Скажи пожалуйста в каких случаях нужно перегружать оператор = ?

Перегрузка оператора + - C++
Есть 2 объекта класса Constr - R1 и R2. В каждом объекте есть string A. Нужно добавить значения первой строки ко второй. Как это сделать?

Перегрузка оператора = - C++
Нужно перегрузить оператор так что бы в начале строки и в конце были квадратные скобки . Все почти работает только вот вывод на экран не...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 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
774 / 707 / 129
Регистрация: 27.07.2012
Сообщений: 2,026
Завершенные тесты: 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     Перегрузка оператора []
Ответ Создать тему
Опции темы

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