简短问题:
C++ STL 实现使用
vector_base
结构/类(用于处理资源和分配器)作为 std::vector
的 基类,而不是使用 组合,是否有原因?
较长版本:
在我提高 C++ 知识的“追求”中,我一直在尝试重新实现一个
Vector
类,大部分都符合 std::
标准。我想我已经足够理解为什么使用分配器是明智的,以及为什么你实际上希望在单独的类/结构中进行所有内存处理(RAII 等等),但我不明白为什么我们想要 std::vector
从该类继承而不是将其作为私有成员。
例如,LLVM和gcc都使用继承。
另一方面,我发现构造函数和赋值运算符(尤其是 move
类型)使用组合更容易处理。
我只是暴露了我对语言的肤浅了解吗?
举个例子,我搜索了一些教科书,发现 Stroustroup 的书有不同版本的标准“模拟重新实现”(只是为了让我更加困惑!)和他 2013 年的书“C++ 编程语言,第四版”。 ”使用组合和他的 2014 年“编程:原理与实践,第二版”。使用继承!
有人可以帮我解释一下吗?
template<class T, class A= allocator<T> > struct vector_base{ A alloc; / / allocator T* v; / / start of allocation T* space; / / end of elements, start of space allocated for possible expansion T* last; / / end of allocated space vector_base(const A& a, typename A: :size_type n) : alloc(a) , v(a.allocate(n)) , space(v+n) , last(v+n) { } ˜vector_base() { alloc.deallocate(v,last-v) ; } };
因此,使用 RAII 基类似乎可以使各种方法更容易正确处理异常。他们不必到处写
try/catch
。