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

Преобразования абстрактного типа при вычислении выражений (переопределение операций) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ В матрице определить произведение суммы индексов двух максимальных элементов http://www.cyberforum.ru/cpp-beginners/thread555270.html
в двумерном массиве определить произведение суммы индексов двух максимальных элементов главной диагонали а также расположить элементы второго столбца в порядке убывания
C++ Сравнение 2х числовых массивов и генерация 3го Собственно задание таково: создать два числовых массива, сравнить их и элементы массива m2, которые отсутствуют в массиве m1 записать в массив m3. Вот что написал я: #include <stdio.h> #include... http://www.cyberforum.ru/cpp-beginners/thread555261.html
Задача на тексты. C++
Зашифруйте текст, записанный с помощью русских букв и знаков препинания, заменив каждую букву непосредственно следующей за ней по алфавиту. Расшифруйте текст.
Определить количество чисел, входящих в последовательность по одному разу C++
Помогите пожалуйста составить программу: Даны целые числа a1, a2, ... an. Определить количество чисел, входящих в последовательность по одному разу. Тема: Одномерные массивы
C++ задачи с++ http://www.cyberforum.ru/cpp-beginners/thread555228.html
помогите пожалуйста 1.Среднее арифметическое элементов массива с p1-го по p2-й (значения p1 и p2 вводятся с клавиатуры; p2> p1). 2.Дана целочисленная матрица размера NxM. Заменить в данной...
C++ _TCHAR szTestString[] = как сделать тут ввод с клавиатуры и возможно ли это Вот текст программы // Osi.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include <iostream> #include <Windows.h> #include <locale.h> #include <tchar.h>... подробнее

Показать сообщение отдельно
SkyCloud
Сообщений: n/a

Преобразования абстрактного типа при вычислении выражений (переопределение операций) - C++

22.04.2012, 18:24. Просмотров 393. Ответов 0
Метки (Все метки)

Добрый день! В процессе изучения С++ столкнулся с нетривиальной трудностью, которую сам для себя никак не могу объяснить.

Пусть есть прообраз некоторого типа данных для математических вычислений. Что конкретно он из себя представляет, предполагаю, не имеет значения, важно, что он может быть преобразован к типу float и обратно. Для удобства приведены только объявления соответствующих функций и методов класса:

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
class DynamicTest
{
    DATA *data;                          //указатель на данные в памяти
    unsigned int num_data;                               //количество данных в памяти
public:
    DynamicTest(unsigned int num_data = 10, float *initializer = NULL); //конструктор   
    DynamicTest(float fFloat);                   //конструктор преобразования float к DynamicTest   
    DynamicTest(DynamicTest &obj);               //конструктор копирования  
    ~DynamicTest()                               //деструктор
 
    operator float();                                       //операция преобразования к типу float
    
    DynamicTest operator+(DynamicTest &op); //операция сложения
    DynamicTest operator-(DynamicTest &op); //операция вычитания
    DynamicTest operator*(DynamicTest &op)  ;   //операция умножения
    DynamicTest operator/(DynamicTest &op); //операция деления
    DynamicTest& operator=(DynamicTest &source);//операция присваивания
    DynamicTest& operator=(float f);                //операция присваивания
    
    float get_float(unsigned int i);    
    int get_int(unsigned int i);    
 
    //дружественные функции-операции
    friend DynamicTest operator+(DynamicTest& dt_op, float f_op);
    friend DynamicTest operator+(float f_op, DynamicTest& dt_op);
    friend DynamicTest operator-(DynamicTest& dt_op, float f_op);
    friend DynamicTest operator-(float f_op, DynamicTest& dt_op);
    friend DynamicTest operator*(DynamicTest& dt_op, float f_op);
    friend DynamicTest operator*(float f_op, DynamicTest& dt_op);
    friend DynamicTest operator/(DynamicTest& dt_op, float f_op);
    friend DynamicTest operator/(float f_op, DynamicTest& dt_op);
};
 
// реализация функций-членов класса и операций:
................
 
void main(void)
{
        DynamicTest a(10, iF1), b(12, iF2), c(10, iF3), d(10, iF4), e(10, iF5);   //объекты созданного типа
        DynamicTest result;                                                           //результат
 
        result = (a + c + 3) / (d + 4.57f) + e - b + 1;                           //вычисляем выражение
 
        // вывод результата:
        ........
}
Если определена операция operator float(), то компилятор сначала вычисляет выражение (a + c) в типе DynamicTest, затем преобразовывает результат к float, складывает с 3, и т.д. В конечном итоге всё выражение при вычислении постепенно приводится к float, после чего, на последнем шаге, конвертируется обратно в DynamicTest и присваивается переменной result. Откуда такая логика работы компилятора? Более того, при даже выражения типа result = a + b, где все переменные абстрактного типа, тоже вычисляются с приведением во float, который затем приводится к абстрактному типу для result. При этом теряется почти ВСЯ информация, свойственная абстрактному типу.

Если закомментировать или удалить операцию operator float(), то всё нормально, всё выражение вычисляется в DynamicTest и ничего нигде не теряется. Зато нельзя писать выражения типа float y = b, где b - переменная абстрактного типа.

Компилятор - Microsoft Visual Studio 2010. Всю описанную логику при вычислении выражения смотрел в отладчике. Полный файл текста программы приложен.

Это не настолько принципиальный момент, конечно. Операцию преобразования типа к float всегда можно реализовать в виде функции, например, get_float, которая, по сути, то же самое и делает, и даже в расширенном виде. Но всё равно хотелось бы понять, почему компилятор всё преобразовывает к базовому типу, чтобы в дальнейшем проектировать более продуманные программы. Спасибо за внимание, жду ваших ответов!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru