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

Как это сделать? - C++

Восстановить пароль Регистрация
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 13:26     Как это сделать? #1
Предположим, есть некоторый класс, например, TTrigonometricComplex и я хочу сделать нём функции, которые будут доступны в левой части оператора присваивания и будут выполнять некоторые операции при присваивании, если же их указать в правой части, то другие.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TTrigonometricComplex
{
 protected:
  double AbsoluteData;
  double ArgumentData;
 public:
  double &Absolute     (); // Эта функция вопросов не вызывает
  double &Argument   (); // И эта функция вопросов не вызывает
  double &Real           (); // А эта вызывает
  double &&Imaginary(); // И эта тоже
};
double TTrigonometricComplex::Absolute ()
{
 return AbsoluteData;
}
double TTrigonometricComplex::Argument()
{
 return ArgumentData;
}
C++
1
2
3
4
5
6
7
8
9
10
TTrigonometricComplex a;
double x;
x=a.Absolute  (); // Функция вернёт ссылку, оператор выполнит x=AbsoluteData;
x=a.Argument(); // Функция вернёт ссылку, оператор выполнит x=ArgumentData;
a.Absolute  ()=x; // Функция вернёт ссылку, оператор выполнит AbsoluteData  =x;
a.Argument()=x; // Функция вернёт ссылку, оператор выполнит ArgumentData=x;
x=a.Real(); // Здесь надо выполнить x=AbsoluteData*cos(ArgumentData);
a.Real()=x; // А здесь TAlgebraicComplex b; b.Real()=x; b.Imaginary()=a.&Imaginary(); a=b;, то есть вычислить новые AbsoluteData и ArgumentData, соответствующие действительной части, равной x и мнимой части, равной старому значению мнимой части a
x=a.Imaginary(); // Здесь надо выполнить x=AbsoluteData*sin(ArgumentData);
a.Imaginary()=x; // А здесь TAlgebraicComplex b; b.Imaginary()=x; b.Real()=a.&Real(); a=b;, то есть вычислить новые AbsoluteData и ArgumentData, соответствующие мнимой части, равной x и действительной части, равной старому значению действительной части a
.
Можно это вообще сделать? И как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2012, 13:26     Как это сделать?
Посмотрите здесь:

как это сделать C++
Как это сделать? C++
Ну как это сделать? C++
C++ Как это сделать?
C++ Как это сделать ? [c++]
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
31.05.2012, 14:39     Как это сделать? #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class TempTrigReal {
    double AbsoluteValue, ArgumentData;
protected:
    friend class TTrigonometricComplex;
    TempTrigReal(const double&, const double&);
public:
    double operator=(const double&);
    operator double();
};
 
TempTrigReal TTrigonometricComplex::Real() {
    return TempTrigReal(AbsoluteValue, ArgumentData);
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 14:44  [ТС]     Как это сделать? #3
Не очень понял.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
31.05.2012, 15:08     Как это сделать? #4
Функция Real() возвращает объект вспомогательного класса. Он обладает оператором= и оператором double, т. е. ему можно присваивать значение и можно использовать его как значение.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
31.05.2012, 16:39  [ТС]     Как это сделать? #5
На каждое свойство заводить по отдельному классу? И потомкам TComplex их надо 4? Итого вместо 3-х классов 7? А каким образом он выполнит присваивание в поля экземпляра TTrigonometricComplex? Откуда он знает, где они находятся? Может внутри временного объекта завести ссылки, или указатели?
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
31.05.2012, 18:21     Как это сделать? #6
Цитата Сообщение от taras atavin Посмотреть сообщение
Может внутри временного объекта завести ссылки, или указатели?
Точно, я здесь ошибся.

Насчет громоздкости - можно наследовать вспомогательные от какого-нибудь одного. Но за удобство написания платить все равно придется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.06.2012, 07:10     Как это сделать?
Еще ссылки по теме:

Как это сделать? C++
C++ как это сделать
Как это сделать? C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.06.2012, 07:10  [ТС]     Как это сделать? #7
У них алгоритмы разные, а громоздкость каждого и так мала.

Добавлено через 12 часов 44 минуты
А в TAlgebraicComplex надо наоборот и оба должны быть потомками абстрактного TComplex со всеми четырьмя функциями. Значит ли это, что в каждом из классов надо возвращать временные экземпляры специальных классов из всех 4-х функций, а в их операторах присваивания и приведения использовать информацию времени исполнения?
Yandex
Объявления
01.06.2012, 07:10     Как это сделать?
Ответ Создать тему
Опции темы

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