template <class ItemType> class MyVector { public: MyVector() : _numItems(0),_items(NULL) {/* empty */} /** Returns a reference to the first item in our array,* or a default-constructed item if the array is empty. */ const ItemType & GetFirstItemWithDefault() const { return (_numItems > 0) ? _items[0] : _defaultItem; } [other methods omitted because they aren't relevant] private: int _numItems; // how many valid items (_items) points to ItemType * _items; // demand-allocated const ItemType _defaultItem; };
这个类非常方便使用 – 任何代码都可以#include“MyVector.h”然后开始声明MyVector和MyVector类型的对象,等等,而且所有Just Works(tm)都没有任何需要的东西.
然而,令我困扰的一件事是_defaultItem成员变量的存在,这仅仅是为了让GetFirstItemWithDefault()能够在容器为空时返回有效的引用.反对意见是,如果我声明N MyVector对象,那意味着_defaultItem的N个副本也将出现在RAM中 – 即使它们都是相同且只读的,因此实际上只需要其中一个过程,而不是每个MyVector一个.
因此,显而易见的解决方案是使_defaultItem成为静态….但AFAICT带来了成本:如果我这样做,任何旧的代码片段都不再可能简单地#include“MyVector.h”而去. ..现在用户必须确保在他的一个.cpp文件中为该静态变量声明存储,这是(a)屁股的痛苦,并且(b)意味着代码的用户必须知道该类的内部实现的细节.由于_defaultItem是一个私有成员变量,因此该类的用户不必考虑它或甚至意识到它存在,更不用说知道他需要为它声明存储. (如果两个独立的代码段都为它声明了存储,每个不知道另一个已经做了同样的事情怎么办?这不会导致重复符号链接器错误吗?)
因此,我的问题是:有没有办法告诉C自动为这个静态成员变量提供一个唯一的存储(每个实例化类型的MyVector),以便MyVector的用户不必知道它? (请注意,对于MyVector< ...>的所有可能实例化,它都需要是自动的,而不仅仅是针对一些常见情况)
解决方法
原文地址:https://www.jb51.cc/c/119795.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。