【发布时间】:2021-10-08 17:01:41
【问题描述】:
所以最近我一直在用 C++ 编写一个基本的数学库,并决定制作模板类和继承的、专门的类,例如 Vector。
我在链接父类的默认构造函数时遇到了一些问题,而无需创建一个新构造函数。 我可以看到 using 关键字还允许我使用我想要的任何基类构造函数,但另一种解决方案(下面的那个)似乎更优雅。
template<typename type>
class Vector3D : public Vector<type, 3>
{
public:
/// Telling compiler to use constructors of parent class Vector
using Vector<type, 3>::Vector;
Vector3D() : KMath::Vector<type, 3>() {}
当我看到这两种方法都有效时,我很好奇它们之间有什么区别,是否有更好/更广泛使用的方法?
编辑:为了明确起见,我将在此处粘贴父类:
template<typename type, unsigned int SIZE>
class Vector
{
protected:
type vectorTuple[SIZE];
public:
explicit Vector()
{
unsigned int i;
for (i = 0; i < SIZE; ++i)
{
vectorTuple[i] = 0.0;
}
}
explicit Vector(type arr[SIZE])
{
unsigned int i;
for (i = 0; i < SIZE; ++i)
{
vectorTuple[i] = arr[i];
}
}
...
};
我的问题不仅在于调用了默认构造函数,还在于另一个构造函数,因为如果没有 using 关键字,如果我尝试编译器会返回错误
double arr[3] = {1, 2, 3};
Vector3D<double> vec(arr);
如果没有 using 关键字或在派生类中创建相同类型的构造函数,代码显然无法工作。我在网上的某个地方看到过这个解决方案,只是想看看它是否有任何影响。
【问题讨论】:
-
如果您认为越冗长越优雅,请务必进行大量可避免的冗余输入。我不确定为什么你甚至需要
using作为默认构造函数。 -
我不认为您的示例说明了您在链接方面遇到的问题。在这种情况下,您可以同时省略
using和Vector3D构造函数,而不会改变含义。基类是一个模板,因此如果您遇到链接器问题,它与实例化有关;例如正文不存在于标题中。我可以想到一个会出现这个问题的案例,但它涉及多个源文件,并且显式编写的派生类构造函数的主体也在 CPP 文件(不是 H 文件)中。
标签: c++ inheritance constructor using