use*_*748 2 c++ inheritance templates
我有一个抽象基类,其中包含一个数组以及两个或多个继承类,这些继承类希望在基类中具有稍大的数组。
我尝试使用模板来解决这个问题:
template <int arraySize>
class Baseclass {
public:
uint16_t arr[arraySize];
};
class InheritedClass :
public Baseclass <5> {};
Run Code Online (Sandbox Code Playgroud)
我现在面临的问题是:每当我使用指向某个基类对象的指针时,编译器都会抱怨:
类模板“Baseclass”的参数列表丢失
我想我明白这里发生了什么:没有模板参数的基类现在不是一个完整的类型 - 但编译器需要一个。
因此我想知道 - 是否有一种(更好的)方法来实现我想要做的事情,而不需要在 InheritedClass 中分配数组并将指针传递给 Baseclass?
先感谢您!
如果数组直接嵌入到基类中(如您的示例所示),则无法指定该数组的大小。更准确地说,更改该数组的大小将需要为每个特定的数组大小生成该基类的完全不同的版本。这将达不到目的,因为显然,您的意图是在层次结构中拥有一个公共基类。是吗?
这正是您的模板“解决方案”遇到的问题。你的程序不再有共同点Baseclass了。相反,您拥有Baseclass<5>,Baseclass<10>等等 - 所有完全不同的、独立的基类。显然,这不是您所需要的。
实现其中包含运行时大小的数组的公共基类的唯一方法是将数组间接存储在基类中。uint16_t *即在基类中声明一个指针并在运行时分配适当数量的内存。或者您可以简单地使用std::vector<uint16_t>而不是原始数组。
请注意,如果您决定采用指针方式,则并非绝对需要动态分配数组内存。您可以简单地使实际的“数组内存”成为派生类的成员,该派生类已经“知道”具体大小
class Baseclass {
public:
uint16_t *arr;
size_t arraySize;
Baseclass(uint16_t *arr, size_t arraySize) : arr(arr), arraySize(arraySize)
{}
};
class InheritedClass : public Baseclass
{
InheritedClass() : Baseclass(arr_memory, 5)
{}
private:
uint16_t arr_memory[5];
};
Run Code Online (Sandbox Code Playgroud)
因此,底线是,如果您希望将数组内存管理完全封装到 中Baseclass,那么您别无选择,只能在运行时动态分配内存。如果这是不可接受的,那么您将被限制在其他地方执行内存管理并将其Baseclass从外部向下传递。