【发布时间】:2021-03-25 13:30:29
【问题描述】:
我创建了一个类来表示向量 (Vec3D),以及它的基本规范操作(求和、标量积、叉积等)。我将使用这个类来派生真实物理单位的类(位置、速度、加速度、力等),它们将具有自己的“专有”特征和操作,*除了它们的矢量操作.
我希望 Vec3D 是不可实例化的,因为一切都必须是一个物理单元,但使其抽象意味着我必须再次为每个派生类重新定义所有运算符。
这里的最佳实践是什么,可以让我利用已经定义的运算符? (也许将构造函数定义为私有,将运算符定义为公共?
和
在什么情况下需要使用虚函数?
在我的基类之下:
class Vec3D
{
private:
double _x;
double _y;
double _z;
protected:
// Constructors / Destructor
Vec3D(const double x, const double y, const double z);
Vec3D();
Vec3D(const Vec3D& source);
Vec3D(Vec3D&& source);
~Vec3D(); // Declared just for completeness, although not necessary
public:
// Operator Overloading
Vec3D& operator=(const Vec3D& source);
Vec3D& operator=(Vec3D&& source);
Vec3D& operator+=(const Vec3D& source);
Vec3D& operator+=(Vec3D&& source);
Vec3D operator+(const Vec3D& source) const;
Vec3D operator+(Vec3D&& source) const;
Vec3D operator-() const;
Vec3D& operator-=(const Vec3D& source);
Vec3D& operator-=(Vec3D&& source);
Vec3D operator-(const Vec3D& source)const;
Vec3D operator-(Vec3D&& source) const;
Vec3D operator*(const double source) const;
double operator*(const Vec3D& source) const;
double operator*(Vec3D&& source) const;
Vec3D operator^(const Vec3D& source) const;
Vec3D operator^(Vec3D&& source) const;
};
谢谢
【问题讨论】:
-
您不需要赋值、复制或“移动”函数(以及析构函数)。使用the rule of zero 并依赖编译器生成的隐式运算符和构造函数。此外,对运算符同时使用 const lvalue 和 rvalue 重载是没有意义的。使用其中一种,但不能同时使用。
-
谢谢,我知道这一点,但不想使用动态成员变量过于复杂。我试图回答的问题是另一个问题。
-
反之,通过使用非“动态”成员变量,可以使用零规则,不需要
Vec3D(const Vec3D& source);、Vec3D(Vec3D&& source);、~Vec3D();、Vec3D& operator=(const Vec3D& source);和Vec3D& operator=(Vec3D&& source);。您可以删除所有这些功能,并且复制和移动将仍然按预期工作。 -
你不需要
Vec3D operator-(const Vec3D& source)const;和Vec3D operator-(Vec3D&& source) const;。只需要每个函数的左值版本。所有其他功能也是如此。 -
你的设计不太好用,有几个原因。首先,由于
Vec3D不可实例化,所有返回Vec3D的方法都是不可调用的,因此完全不需要。其次,所有接受Vec3D引用的方法都是危险的,因为它们可以用错误的向量类型调用(将速度添加到位置没有意义)。您正在尝试做的是一项相当复杂的任务。我建议在尝试自己制作之前研究处理物理量的现有库,例如 Boost.Units。
标签: c++ polymorphism abstract-class virtual-functions