crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Point3d, Класс 3-мерной точки.
motoden
  опции профиля:
сообщение 10.10.2014, 23:51
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 12
Регистрация: 13.10.2012
Пользователь №: 3555

Спасибо сказали: 0 раз(а)




Репутация:   0  


Создал класс 3-мерной точки, т.к. не нашел готового в библиотеке. QPoint реализован только для 2-мерного случая. Представляю его на ваш суд. Кто что думает?

class Point3D{
public:
    Point3D(){
        val_x = 0;
        val_y = 0;
        val_z = 0;
    }

    Point3D(double in_x,
            double in_y,
            double in_z){
        val_x = in_x;
        val_y = in_y;
        val_z = in_z;
    }

    Point3D(Point3D &in_point3d){
        val_x = in_point3d.x();
        val_y = in_point3d.y();
        val_z = in_point3d.z();
    }

    Point3D operator + (Point3D in_point3d){
        Point3D result;
        result.setX(val_x + in_point3d.x());
        result.setY(val_y + in_point3d.y());
        result.setZ(val_z + in_point3d.z());
        return result;
    }

    Point3D operator += (Point3D in_point3d){
        qDebug()<<"+=";
        val_x += in_point3d.x();
        val_y += in_point3d.y();
        val_z += in_point3d.z();
        return (*this);
    }

    Point3D operator * (Point3D in_point3d){
        Point3D result;
        result.setX(val_x * in_point3d.x());
        result.setY(val_y * in_point3d.y());
        result.setZ(val_z * in_point3d.z());
        return result;
    }

    Point3D operator *= (Point3D in_point3d){
        val_x *= in_point3d.x();
        val_y *= in_point3d.y();
        val_z *= in_point3d.z();
        return *this;
    }

    double x(){
        return val_x;
    }

    double y(){
        return val_y;
    }

    double z(){
        return val_z;
    }

    void setX(double in_x){
        val_x = in_x;
    }

    void setY(double in_y){
        val_y = in_y;
    }

    void setZ(double in_z){
        val_z = in_z;
    }

private:
    double val_x;
    double val_y;
    double val_z;
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 11.10.2014, 12:12
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


0. http://qt-project.org/doc/qt-4.8/qvector3d.html

Ну а по поводу самописного, все зависит от того как вы его будете использовать
Из очевидного:
1. Не всегда нужен double, int тоже часто используется. В Qt это решено QPoint и QPontF, но можно сделать шаблон в вашем простом случае.
2. Вкусовщина, но два конструктора можно заменить на 1, тогда класс можно использовать и для двумерного и для одномерного случая
Point3D( double x = 0, double y =0, double z = 0 );
3. Неправильный конструктор копирования, в параметрах должно быть const Point3D&.
4. Если перегружаете конструктор копирования, перегружайте operator=
5. Во всех перегруженных операторах параметры должны быть const Point3D&
6. operator+, operator* должны быть const
7. operator+=, operator*= должен возвращать const Point3D&
8. Нет оператора -, унарный минус.
9. Нет операторов сравнения.
10. Вкусовщина, вместо:
result.setX(val_x * in_point3d.x());
Можно писать
result.val_x = val_x * in_point3d.val_x;
11. Геттеры должны быть константные.

Рекомендую почитать:
http://www.amazon.com/Effective-Specific-I...s/dp/0321334876
http://www.amazon.com/More-Effective-Impro...s/dp/020163371X

В общем, с моей колокольни, лучше бы вы оставили его POD-типом
http://stackoverflow.com/questions/146452/...-pod-types-in-c
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2024, 11:36