我有一个模板化容器类,类似于这个玩具代码:
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 等类型的对象,这一切都可以正常工作(tm),不需要任何麻烦。
然而,让我困扰的一件事是 _defaultItem 成员变量的存在,它的存在只是为了让 GetFirstItemWithDefault() 能够在容器为空时返回有效引用。反对意见是,如果我声明 N 个 MyVector 对象,这意味着 RAM 中也会存在 _defaultItem 的 N 个副本 --- 即使它们都是相同的且只读,因此实际上每个只需要其中一个进程,不是每个 MyVector 都有一个进程。
因此,显而易见的解决方案是使 _defaultItem 静态......但 AFAICT 会带来成本:如果我这样做,任何旧代码都不再可能简单地#include“MyVector.h”并继续。 .. 现在用户必须确保在他的一个 .cpp 文件中声明该静态变量的存储,这(a)是一件令人头疼的事情,(b)意味着代码的用户必须意识到类的内部实现的细节。由于 _defaultItem 是一个私有成员变量,所以该类的用户不必考虑它,甚至不必意识到它的存在,更不用说知道他需要为其声明存储空间。 (如果两段独立的代码都声明了它的存储空间,而彼此不知道对方做了同样的事情,会怎么样?这不会导致重复符号链接器错误吗?)
因此,我的问题是:有没有办法告诉 C++ 自动为这个静态成员变量提供一个唯一的存储(每个 MyVector 的实例化类型),以便 MyVector 的用户不必知道它? (请注意,对于 MyVector<...> 的所有可能实例化,它需要是自动的,而不仅仅是对于一些常见情况)
为什么不将该默认项设为该函数的静态本地项?
const ItemType & GetFirstItemWithDefault() const
{
static const ItemType _default;
return (_numItems > 0) ? _items[0] : _default;
}
如果您想再次检查其他函数中的默认项,这可能不是您想要的,但为此您也可以将其放入单独的函数中(本身可能是静态的):
static const ItemType& GetDefault() const
{
static const ItemType _default;
return _default;
}
当您需要访问默认项目时调用该函数。
也就是说,我认为拥有默认项目并不是很好。std::vector
也没有并且不需要它。只需告诉用户检查向量是否为empty
并完成。隐藏静态的一个问题是,你不知道ItemType
。它可能是一个消耗大量资源的类,而您刚刚创建了另一个实例!也许重新考虑该类的设计,然后切换到std::vector
. :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)