【发布时间】:2021-02-14 10:26:09
【问题描述】:
用例:
-
Vector类(实现一些数学运算)和派生的Vector2D类 - 理想情况下,两个类都应允许彼此“复制构造”
Vector
namespace mu {
template<std::size_t N, typename T>
class Vector {
public:
// ...
template <typename... TArgs>
Vector(TArgs... args) : data({args...}) {}
Vector(const Vector &other) = default; // copy constructor
// ...
protected:
std::array<T, N> data;
};
}
Vector2D
namespace mu {
template<typename T>
class Vector2D : public Vector<2,T> {
public:
using Vector<2, T>::Vector; // inherit base class constructors
Vector2D(const Vector<2, T>& other) : Vector<2, T>(other) {}
// Vector2D specific functions, e.g. rotation
//...
};
}
注意:实际的类包含更多内容,但我将其浓缩为我认为在这里最重要的代码。
问题是我无法实现一种可以从Vector2D 构造Vector 的方法,请参见下面的代码。所有其他情况都可以正常工作。
// Example 1 (compiles)
mu::Vector<2, int> a{1, 2};
mu::Vector<2, int> b{a};
// Example 2 (compiles)
mu::Vector2D<int> c{1, 2};
mu::Vector2D<int> d{c};
// Example 3 (compiles)
mu::Vector<2, int> e{1, 2};
mu::Vector2D<int> f{e};
// Example 4 (doesn't compile) <-- how to get this to work?
mu::Vector2D<int> g{1, 2};
mu::Vector<2, int> h{g};
当然,更普遍的问题是继承是否是构建这些类的正确方法。但我希望Vector2D 拥有Vector 的所有功能以及Vector 没有的其他功能。
【问题讨论】:
-
此数据不应组织为类层次结构。拥有一个单独的
Vector2D类并没有多大意义。 2D 向量是Vector<2, ..>仅此而已。所以它是一个简单的别名,而不是一个全新的类。或者,Vector2D使用Vector作为其 内部 表示形式(因此包含,而不是继承)。 -
我也想过这个问题,但是 Vector2D 不仅是 Vector 的“typedef”,而且具有 Vector 所没有的更具体的功能。例如,它包含旋转 Vector2D 的函数。
-
您可以旋转任意维度的向量,但这不是重点。您不是第一个尝试以这种方式实现几何向量的人。去过也做过。它不起作用。
-
它不起作用,因为除了这个小的初始化问题之外还有很多问题。您可能会或可能不会在您的特定应用程序中遇到它们,但您应该知道一般公共继承适用于基于身份的对象,但效果不佳基于值的对象。
-
我建议宁愿将所有这些特定 tp 2D 向量的附加函数实现为独立的非成员函数,而忘记单独的类。
标签: c++ c++11 templates inheritance constructor