vector_base 继承与组合

问题描述 投票:0回答:2

简短问题:

C++ STL 实现使用

vector_base
结构/类(用于处理资源和分配器)作为 std::vector
基类
,而不是使用 组合,是否有原因?

较长版本:

在我提高 C++ 知识的“追求”中,我一直在尝试重新实现一个

Vector
类,大部分都符合
std::
标准。我想我已经足够理解为什么使用分配器是明智的,以及为什么你实际上希望在单独的类/结构中进行所有内存处理(RAII 等等),但我不明白为什么我们想要
std::vector
从该类继承而不是将其作为私有成员。 例如,LLVMgcc都使用继承。 另一方面,我发现构造函数和赋值运算符(尤其是
move
类型)使用组合更容易处理。

我只是暴露了我对语言的肤浅了解吗?

举个例子,我搜索了一些教科书,发现 Stroustroup 的书有不同版本的标准“模拟重新实现”(只是为了让我更加困惑!)和他 2013 年的书“C++ 编程语言,第四版”。 ”使用组合和他的 2014 年“编程:原理与实践,第二版”。使用继承!

有人可以帮我解释一下吗?

c++ stl
2个回答
8
投票

libc++ 使用 private 继承,libstdc++ 使用 protected 继承。

受保护和私有继承很大程度上是一种“组合的语法变体”。


0
投票
https://www.stroustrup.com/ except.pdf

经验表明,使用显式 try 块编写正确的异常安全代码 比大多数人预想的要困难。事实上,这是不必要的困难,因为 还有一种替代方法:“资源获取即初始化”技术可以是 用于减少编写的代码量并使代码更加风格化。在这个 在这种情况下,向量所需的关键资源是保存其元素的内存。通过提供一个辅助类来表示向量使用的内存概念,我们可以 简化代码并减少意外忘记发布的机会:

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

    

© www.soinside.com 2019 - 2024. All rights reserved.