Имам шаблонен клас контейнер, нещо като този код на играчка:
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;
};
Този клас е наистина удобен за използване -- всеки код може просто да #включи "MyVector.h" и след това да започне да декларира обекти от тип MyVector и MyVector и така нататък, и всичко просто работи (tm) без да е необходимо каквото и да е бъркане.
Едно нещо, което ме притеснява обаче, е наличието на променливата член _defaultItem, която е там единствено, за да даде възможност на GetFirstItemWithDefault() да върне валидна препратка, когато контейнерът е празен. Възражението е, че ако декларирам N MyVector обекта, това означава, че N копия на _defaultItem ще присъстват и в RAM --- въпреки че всички те са идентични и само за четене, така че наистина трябва да има само едно от тях на процес, а не един на MyVector.
И така, очевидното решение е да направя _defaultItem статичен .... но AFAICT, който идва с цена: ако направя това, вече не е възможно нито една стара част от кода просто да #include "MyVector.h" и да тръгне. .. сега потребителят трябва да е сигурен, че е декларирал съхранение за тази статична променлива в един от своите .cpp файлове, което е (а) болка в задника и (б) означава, че потребителят на кода трябва да е наясно от детайлите на вътрешната реализация на класа. Тъй като _defaultItem е частна членска променлива, потребителят на класа не трябва да мисли за нея или дори да осъзнава, че съществува, камо ли да знае, че трябва да декларира място за съхранение за нея. (и какво ще стане, ако два отделни фрагмента код декларират съхранение за него, като всеки не знае, че другият е направил едно и също нещо? Това няма ли да причини грешка на свързващия дублиран символ?)
Следователно въпросът ми е: има ли някакъв начин да кажа на C++ автоматично да предоставя едно уникално хранилище (за инстанциран тип на MyVector) за тази статична променлива член, така че потребителите на MyVector да не знаят за това? (Имайте предвид, че трябва да е автоматично за всички възможни инстанции на MyVector‹...>, а не само за няколко често срещани случая)