考虑下面的类层次结构:如何在二维类型层次结构中提供类型安全性?
class A {};
class B : public A {};
class C : public A {};
class D : public A {};
假定它不是平凡还原:B,C和d具有至少一个成对间断构件定义和至少一个共享成员定义从A.继承
现在考虑包含指向物体从第一个容器的层次结构:
class AV : public std::vector<A*> {};
class BV : public AV {}; // contains only B*
class CV : public AV {}; // contains only C*
class DV : public AV {}; // contains only D*
再次,假设如上述定义它是不平凡还原。
这些类被认为是“集装箱与特征”:提供公共容器功能一起的“获取的平均”,“是否有任何元件满足”等线它们的元素和功能。对V的操作总是假设{A,B,C,D}中x的类的元素。
现在的问题是,AV的儿童提供的,而不是B *自己的实际内容实例化A *的std ::向量函数,C *,d *分别。
有三种解决方案,我可以看到,所有的不幸的缺点:在类
- 倍率的std ::向量成员[B | C | d] V至转换为正确的指针类型
- 明显的缺点:大量的样板代码
- 设AV不从标准::矢量继承和代替使[B | C | d】V从相应的std ::矢量继承< [A | B | C] *>实例化
- 明显的缺点:AV不再能够用于其中来自A类只元件构件中使用的代码。
- 没有定义[A | B | C | d] V作为类层次结构,但作为类模板,提供每个模板参数实现[A | B | C | d]
- 明显的缺点:损失隐含层次结构信息,特别是使用IDE工具如Visual Studio - >代码越来越难以导航
注意,如果容器是构件代替的父类的问题仍然存在[A | B | C | d】V。
是否有更好的解决了困惑?如果它是惯用的,它是怎么叫的?
及其简化为清楚起见:
- C指针,而不是更合适的std :: weak_pointer
- 短的类名,而不是从一个STL容器继承告诉那些
- 提供容器函数[s | ality]是免费的,因为继承的目的就是这样。
提供了STL容器的成员,而不是将导致执行代表的大部分职能沿着这些路线:
class AV
{
public:
auto begin() { return this->container.begin(); }
auto end() { return this->container.end(); }
/* etc. pp. */
protected:
std::vector<A*> container;
}
4.实现一个完全类型安全的模板。这会导致代码臃肿,但这就是C++的全部内容。 –
不要从std :: vector继承..避免存储指针(甚至是智能指针),除非你需要多态。 –
我认为你应该**重构**避免从'std :: vector'继承的问题。这对读者来说是一条红鲱鱼。正如你注意到的那样,它不是你的问题的必要条件 –