Оператор перегрузки в с ++ - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь перегрузить оператор *, чтобы умножить два объекта (скалярное произведение).

Эти объекты могут быть Point3D, Vector3D или Normal. Все они в основном имеют одинаковую структуру (значения x, y и z), я разделил их только на семантику.

Линия, которая доставляет мне неприятности, такова:

float t = (point - r.origin)*normal / (r.direction * normal);

Здесь point и r.origin - это Point3D, normal - это Normal, а r.direction - это Vector3D. В заголовочных файлах для этих классов у меня есть следующие функции перегрузки:

В Vector3D.h:

Vector3D operator *(Normal& n);

В Point3D.h:

Point3D operator -(Point3D& p);
Point3D operator *(Normal& n);

Я получаю ошибку:

No match for 'operator*' in 'r->Ray::direction * ((const Plane*)this)->Plane::normal'

Предполагая, что я правильно заполнил функции в файле .cpp, я что-то не так сделал? Кроме того, не обращайте внимания на тот факт, что еще нет оператора деления ... Это в процессе!

Приветствия

Ответы [ 2 ]

5 голосов
/ 29 марта 2012

Возможно, вы определили унарные версии вместо бинарных версий.(Вы определили их внутри класса {...}?)

Или, возможно, вы не определили их как const.Попробуйте это:

Vector3D operator *(const Normal& n) const;
Point3D operator -(const Point3D& p) const;
Point3D operator *(const Normal& n) const;

Для бинарных функций с такими гетерогенными параметрами, как мне кажется, гораздо проще определить их все вместе в глобальной области видимости в отдельном файле / месте и отгородить их от классов.

2 голосов
/ 29 марта 2012

Ваш this выглядит так, как если бы он был const (просто угадываете из сообщения об ошибке, поскольку вы не включили этот код в свой вопрос). Попробуйте:

Vector3D operator *(const Normal& n);

Point3D operator -(const Point3D& p);
Point3D operator *(const Normal& n);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...