2012-03-29 2 views
1

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

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

Линия, которая дает мне проблемы заключается в следующем:

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

Здесь точка и r.origin является Point3D, нормальным является 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, есть ли что-то глупое, что я сделал Вот? Кроме того, проигнорируйте тот факт, что еще нет оператора деления ... Он в стадии разработки!

Приветствия

ответ

5

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

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

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

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

2

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

Vector3D operator *(const Normal& n); 

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

Приветствия за помощь, но изменение их всех на const дает мне ошибки «отбрасывает квалификаторы». Извините, я только начал C++ вчера:/ –

+1

Возможно, вы могли бы предоставить нам [* полный * пример] (http://sscce.org), который демонстрирует проблему, с которой вы сталкиваетесь. Мы можем только догадываться о том, как выглядит остальная часть вашего кода, и это никому не помогает. –

+0

«отбрасывает квалификаторы» означает, что вы вызываете что-то в функции, которая не принимает 'const', но, вероятно, должна. Покажите нам больше кода. –

Смежные вопросы