如何使继承的类与父类仅在C++中的一个值不同

How to make inherited class different from parent only by one value in C++?

本文关键字:一个 C++ 继承 何使 父类      更新时间:2023-10-16

我正在尝试为 UnitVector 编写一个类,已经为通用 Vector 编写了一个类。UnitVector 类与 Vector 类的区别仅在于abs 变量设置为 1.0f 的事实。我想知道解决问题的最佳方法是什么,是最好创建另一个继承 Vector 类的类 UnitVector(我目前的想法,这给我带来了问题(,还是只在 Vector 类中编写一个方法

这是我的 Vector 类代码:

Vector.h

class Vector
{
public:
    Vector();
    Vector(float x, float y);
    void set_by_angle(float abs, float angle);
    void set(float x, float y);
    void rotate(float angle);
    void scale(float scale_factor);
    void translate(float x, float y);
    void translate(Vector v);
    float get_abs();
    float get_angle();
    static Vector create_by_angle(float abs, float angle);
    static Vector create(float x, float y);
    static Vector create_from_vectors(Vector v1, Vector v2, float abs);
    static float get_distance(Vector v1, Vector v2);
    static float get_angle(float x, float y);
    static float get_angle(Vector v);
    void to_string();
    Vector operator=(const Vector &v);
    bool operator==(const Vector &v);
    bool operator!=(const Vector &v);
    Vector operator+=(const Vector &v);
    friend Vector operator+(const Vector &v1, const Vector &v2);
    friend Vector operator-(const Vector &v1, const Vector &v2);
    float x;
    float y;
private:
    float abs;
    float angle;
};

矢量.cpp

#define _USE_MATH_DEFINES
#include <math.h>
#include <iostream>
#include <string>
#include "vector.h"
using namespace std;
Vector::Vector() : Vector(0, 0) {}
Vector::Vector(float x, float y)
{
    set(x, y);
}
void Vector::set_by_angle(float abs, float angle)
{
    this->abs = abs;
    this->angle = angle;
    x = abs * cos(angle);
    y = abs * sin(angle);
}
void Vector::set(float x, float y)
{
    this->x = x;
    this->y = y;
    abs = get_abs();
    angle = get_angle();
}
void Vector::rotate(float angle)
{
    set_by_angle(this->abs, this->angle + angle);
}
void Vector::scale(float scale_factor)
{
    set(x * scale_factor, y * scale_factor);
}
void Vector::translate(float x, float y)
{
    set(this->x + x, this->y + y);
}
void Vector::translate(Vector v)
{
    translate(v.x, v.y);
}
float Vector::get_abs()
{
    return sqrt(pow(x, 2) + pow(y, 2));
}
float Vector::get_angle()
{
    return get_angle(x, y);
}
Vector Vector::create_by_angle(float abs, float angle)
{
    Vector v;
    v.set_by_angle(abs, angle);
    return v;
}
Vector Vector::create(float x, float y)
{
    Vector v;
    v.set(x, y);
    return v;
}
float Vector::get_distance(Vector v1, Vector v2)
{
    return sqrt(pow(v1.x - v2.x, 2) + pow(v1.y - v2.y, 2));
}
Vector Vector::create_from_vectors(Vector v1, Vector v2, float abs)
{
    float x = v2.x - v1.x;
    float y = v2.y - v1.y;
    Vector v;
    v.set_by_angle(abs, Vector(x, y).get_angle());
    return v;
}
float Vector::get_angle(float x, float y)
{
    float tan = 0.0f;
    float angle = 0.0f;
    if (x != 0)
    {
        tan = y / x;
        angle = atan(tan);
        // this setting applies to the graphic reference system
        if (x > 0 && y < 0) angle = 2 * M_PI + angle;
        if (x < 0 && y > 0) angle += M_PI;
        if (x < 0 && y < 0) angle += M_PI;
    }
    if (x == 0)
    {
        if (y > 0) angle = M_PI_2;
        if (y < 0) angle = 3 * M_PI_2;
    }
    if (y == 0)
    {
        if (x > 0) angle = 0.0f;
        if (x < 0) angle = M_PI;
    }
    return angle;
}
float Vector::get_angle(Vector v)
{
    return get_angle(v.x, v.y);
}
void Vector::to_string()
{
    cout << "x: " + std::to_string(x) + " y: " + std::to_string(y) << endl;
}
Vector operator+(const Vector &v1, const Vector &v2)
{
    Vector tmp;
    tmp.set(v1.x + v2.x, v1.y + v2.y);
    return tmp;
}
Vector operator-(const Vector &v1, const Vector &v2)
{
    return v1 + Vector(-v2.x, -v2.y);
}
Vector Vector::operator+=(const Vector &v)
{
    set(x + v.x, y + v.y);
    return *this;
}
Vector Vector::operator=(const Vector &v)
{
    set(v.x, v.y);
    return *this;
}
bool Vector::operator==(const Vector &v)
{
    return
    (
        (x == v.x)
        &&
        (y == v.y)
    );
}
bool Vector::operator!=(const Vector &v)
{
    return !(*this == v);
}

提前感谢!

只需添加以下两种方法:

void normalize()
{
    float scalar = 1.0 / this->get_abs();
    this->x *= scalar;
    this->y *= scalar;
}

和:

static Vector get_unit(const Vector &v)
{
    float scalar = 1.0 / v.get_abs();
    return Vector(v.x * scalar, v.y * scalar);
}