Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.
Здравствуйте, Аноним, Вы писали:
А>Добрый день!
А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.
хм... ну только не плюс.
Можно так сделать:
c = a * b; // dot product
d = a ^ b; // cross product
Re[2]: vect X vect?
От:
Аноним
Дата:
30.05.06 08:51
Оценка:
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, Аноним, Вы писали:
А>>Добрый день!
А>>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.
K>хм... ну только не плюс. K>Можно так сделать: K>
K> c = a * b; // dot product
K> d = a ^ b; // cross product
K>
Так + по приоритету и ассоциативности поближе бедет, если учесть что * задействована.
То есть нужно
[code]
std::cout << Vect1 + Vect2
std::cout << ( Vect1 ^ Vect2)
[code]
Здравствуйте, Аноним, Вы писали:
А>Добрый день!
А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.
Нельзя.
С операторами вообще проблема. В таком как у тебя случае, когда нет явной аналоги между операторами, лучше вообще ими не пользоваться, иначе быстро возникнет путаница. Я бы порекоммендовал воспользоваться функциями.
class scalar_t { ... };
extern scalar_t scalar;
class vector_t {...};
extern vector_t vector;
int main()
{
Vector3D a, b;
double value = scalar * a * b;
Vector3D c = vector * a * b;
}
--
RedApe
Re: vect X vect?
От:
Аноним
Дата:
30.05.06 08:54
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Добрый день!
А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.
Здравствуйте, Аноним, Вы писали:
А>Так + по приоритету и ассоциативности поближе бедет, если учесть что * задействована.
Человек, который увидит в коде v1 + v2, будет предполагать, что это сложение векторов покоординатно. И когда он узнает, что это на самом деле векторное произведение, он тебя побьёт. И будет прав.
Во-первых, "+" имеет самостоятельный смысл (поэлементное сложение векторов).
Во-вторых, умножение бывает — поэлементным, скалярным, векторным. Поэтому перегрузка "*" не очень оправдана.
Что можно предложить?
Здравствуйте, Aera, Вы писали:
A>Хотя нет, еще придумал способ: A>
A>class scalar_t { ... };
A>extern scalar_t scalar;
A>class vector_t {...};
A>extern vector_t vector;
A>int main()
A>{
A> Vector3D a, b;
A> double value = scalar * a * b;
A> Vector3D c = vector * a * b;
A>}
A>
=)
Или
int main()
{
Vector3D a, b;
double value = scalar(a * b);
Vector3D c = vector(a * b);
}
VoidEx wrote:
> { > Vector3D a, b; > double value = scalar(a * b); > Vector3D c = vector(a * b); > }
Это уже лажа, ибо уж проще заменить * на , и записать тривиальное scalar(a,b)
А вот записывать инфиксные операторы в виде:
c = a <vector> b <scalar> z;
может быть даже красяво...
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kan_izh, Вы писали:
_>Это уже лажа, ибо уж проще заменить * на , и записать тривиальное scalar(a,b) _>А вот записывать инфиксные операторы в виде: _>
_>c = a <vector> b <scalar> z;
_>
_>может быть даже красяво...
Неудобняк-с, по причине низкого приоритета операторов < и >. Придётся лепить скобки вокруг.
Оператор , тоже (на мой взгляд) не лучший выбор, потому что:
1) Он определён по умолчанию, и это умолчание синтаксически корректно (имеет тип последнего аргумента), а семантически совсем другое. То есть компилятор не заругается, если ты ошибёшься.
2) Смысл лексемы , перегружен (это не только оператор, но и разделитель в списках аргументов). Читаемость программы пострадает.
Кстати, можно задействовать оператор %.
1) Он также мультипликативный, то есть лишних скобок не надо.
2) Дефолтная семантика (остаток от деления), как и у векторного умножения — некоммутативна. (Векторное умножение — антикоммутативно, a×b = -b×a).
Здравствуйте, Аноним, Вы писали:
А>Можно ли ввести операцию векторного произведения векторов и обозначить ее как принятов в математике но вместо креста взять X. Пока сделал + вроде работаети но не красиво как то.
как вариант — можно использовать прокси-класс с операторами приведения к типу, для "перегрузки" по возвращаемому значению.
int main() {
Vector3D a, b;
double value = a * b; // proxy::operator double
Vector3D c = a * b; // proxy::operator Vector3D &
}
Кодт wrote:
> _>c = a <vector> b <scalar> z; > _>может быть даже красяво...
> Кстати, можно задействовать оператор %. > 1) Он также мультипликативный, то есть лишних скобок не надо. > 2) Дефолтная семантика (остаток от деления), как и у векторного > умножения — некоммутативна. (Векторное умножение — антикоммутативно, a?b > = -b?a).
Ну тогда
c = a /vector/ b /scalar/ z;
или
c = a %vector% b %scalar% z;
Сразу будет виден тип оператора.
Бывает ещё смешанное произведение векторов.
Просто сама идея плодить инфиксные операторы в любом количестве.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай