Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Point3d
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
motoden
Создал класс 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
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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.