У меня есть шаблонный контейнерный класс, что-то вроде этого игрушечного кода:
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, это означает, что N копий _defaultItem также будут присутствовать в ОЗУ - даже если они все идентичны и доступны только для чтения, и поэтому на самом деле должен быть только один из них впроцесс, а не один на MyVector.
Итак, очевидное решение состоит в том, чтобы сделать _defaultItem статическим .... но AFAICT, что сопряжено с затратами: если я это сделаю, это больше невозможно для любого старого кускакод, чтобы просто #include "MyVector.h" и перейти ... теперь пользователь должен обязательно объявить хранилище для этой статической переменной в одном из своих файлов .cpp, что является (а) болью в заднице и (b) означает, что пользователь кода должен быть осведомлен о деталях внутренней реализации класса.Поскольку _defaultItem является закрытой переменной-членом, пользователю класса не нужно думать об этом или даже осознавать, что он существует, не говоря уже о том, что ему нужно объявить хранилище для него.(и что, если два отдельных куска кода оба объявляют хранилище для этого, каждый не зная, что другой сделал то же самое? Разве это не вызвало бы ошибку компоновщика с дублированным символом?): есть ли способ сказать C ++ автоматически предоставлять одно уникальное хранилище (для каждого экземпляра MyVector) для этой статической переменной-члена, чтобы пользователям MyVector не приходилось об этом знать?(Обратите внимание, что он должен быть автоматическим для всех возможных экземпляров MyVector <...>, а не только для нескольких распространенных случаев)