Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 15
1

Однозначная интерпретация объекта

25.02.2019, 13:51. Показов 1037. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Допустим есть класс-родитель и его потомок
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
class Matrix {
    protected:
        double *arr;
        int row;
        int col;
        int ID;
       private:
        ...
                ...
        class Tmp {
        private:
            Matrix *m;
            const Matrix *cm;
            int i;
        public:
            Tmp(Matrix *m, int i);
            Tmp(const Matrix *сm, int i);
            double& operator[](int j);
            const double operator[](int j) const;
        }
class Vector : public Matrix {
    private:
                ...
                ...
    public:
                ...
                ...
        double& operator[](int i);
        const double operator[](int i) const;
    };;
Всё вроде хорошо, но проблема появляется когда начинаешь использовать указатель на базовый класс, который содержит потомка. Для вектора будет создаваться Tmp, когда это совсем не нужно. Можно ли это исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2019, 13:51
Ответы с готовыми решениями:

Интерпретация js
Есть сайт, который возвращает страницу в виде ява скрипта для обфускации через eval. В браузере...

Интерпретация выражений на си
Нужна помощь! Пусть имеется такое описание: struct { int x; char *y; } *p;...

Логическая интерпретация конструкции
Доброго времени суток уважаемые форумчане. Небольшой вопрос, подскажите пожалуйста, как будет, с...

Операция с битами, интерпретация
В массиве есть 2 бита, в зависимости от того какие эти два бита (00, 01, 10, 11) будет...

9
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2019, 13:54 2
Цитата Сообщение от Mecherok Посмотреть сообщение
Допустим есть класс-родитель и его потомок
Круто и?
И почеу это вектор наследник матрицы?
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 15
25.02.2019, 13:56  [ТС] 3
Потому что так требуется по заданию. Вопрос я написал
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2019, 14:05 4
Цитата Сообщение от Mecherok Посмотреть сообщение
Можно ли это исправить?
Убрать Tmp.
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 15
25.02.2019, 14:11  [ТС] 5
Отлично, и как мне реализовывать в матрицы двойную индексацию?

Добавлено через 4 минуты
В матрице есть перегруженный оператор[] который возвращает Tmp, который в свою очередь возвращает тип нужное значение. Сделано это для проверки диапазона. Проблема в том, что при ситуации, которую я изложил выше, это работает не корректно, так как для вектора реализован оператор, который уже сразу возвращает значение.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2019, 14:14 6
Цитата Сообщение от Mecherok Посмотреть сообщение
Для вектора будет создаваться Tmp
Ну, хотя, по коду что вы кинули он не будет создаватся, а что создается у вас одному Богу известно.

Добавлено через 2 минуты
Цитата Сообщение от Mecherok Посмотреть сообщение
это работает не корректно, так как для вектора реализован оператор, который уже сразу возвращает значение
Вас не понять, давайте покажите в коде, как у вас это происходит и где по вашему мнению ошибку.
Но вообще да, ибо вектор != матрица.
0
0 / 0 / 0
Регистрация: 22.04.2018
Сообщений: 15
25.02.2019, 14:23  [ТС] 7
Случайно создал тему, немного недописав. Выше постарался вкратце описать.

Добавлено через 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
27
28
29
30
31
32
33
class Matrix {
    protected:
        double *arr;
        int row;
        int col;
        int ID;
    private:
                ...
        class Tmp {
        private:
            Matrix *m;
            const Matrix *cm;
            int i;
        public:
            Tmp(Matrix *m, int i);
            Tmp(const Matrix *сm, int i);
            double& operator[](int j);
            const double operator[](int j) const;
        };
    public:
                ...
        Tmp operator[](int i);
        const Tmp operator[](int i) const;
    };
 
    class Vector : public Matrix {
    private:
                ...
    public:
        double& operator[](int i);
        const double operator[](int i) const;
    };
};
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
Matrix::Tmp Matrix::operator[](int i) {
    if (i >= this->row || i < 0) throw ("Выход за размер массива в матрице №" + to_string(ID));
    return Tmp(this, i);
}
 
const Matrix::Tmp Matrix::operator[](int i) const {
    if (i >= this->row || i < 0) throw ("Выход за размер массива в матрице №" + to_string(ID));
    return Tmp(this, i);
}
 
double& Matrix::Tmp::operator[](int j) {
    if (j >= this->m->col || j < 0) throw ("Выход за размер массива в матрице №" + to_string(m->ID));
    return m->arr[i * m->col + j];
}
 
const double Matrix::Tmp::operator[](int j) const {
    if (j >= this->cm->col || j < 0) throw ("Выход за размер массива в матрице №" + to_string(cm->ID));
    return cm->arr[i * cm->col + j];
}
 
double& Vector::operator[](int i) {
    if (i >= size || i < 0) throw ("Выход за размер массива в векторе №" + to_string(ID));
    return arr[i];
}
 
const double Vector::operator[](int i) const {
    if (i >= size || i < 0) throw ("Выход за размер массива в векторе №" + to_string(ID));
    return arr[i];
}
Добавлено через 4 минуты
Собственно вот, проблема в том, что для вектора наследуется double& Matrix::Tmp::operator[], и в экземпляре вектора, который хранится в указателе на базовый класс, при использовании индексации будет создаваться Tmp. Преподаватель сказал решить это с помощью виртуальных функций, но я не совсем понимаю каким образом
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2019, 14:37 8
Mecherok, это не демонстрирует проблемы

Вероятно, виртуальность могла бы помочь если бы Вектор был базовым.
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
25.02.2019, 14:40 9
Mecherok, может наоборот, матрицу от вектора наследовать,потому что каждую матрицу можно обработать как вектор, но не наоборот.

Добавлено через 1 минуту
Цитата Сообщение от Azazel-San Посмотреть сообщение
у вас точно такое задание?
если ему дали такое задание, использовать наследование в данном случае, тогда я даже не знаю ...., может поиздеваться захотели.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.02.2019, 14:51 10
Цитата Сообщение от _stanislav Посмотреть сообщение
если ему дали такое задание
Задания мы так и не видели.
0
25.02.2019, 14:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.02.2019, 14:51
Помогаю со студенческими работами здесь

Интерпретация отрицательных чисел в сортировке
Здравствуйте, уважаемые форумчане и знатоки c++. Имеется lsd поразрядная сортировка для целых...

Интерпретация программы из среды VS в CodeBlocks
Уважаемые форумчани, помоги интерпретировать небольшую программу, написанную в среде Visual Studio...

Считывание команд из файла и их интерпретация
Приветствую! Нужен ваш на свет по поводу: есть файл с командами вида т.е. есть 3 класса...

Интерпретация char в виде int
Напишите функцию, которая принимает строку из нулей и единиц, интерпретируя ее как двоичное число,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru