Извините, если заголовок в замешательстве, я не мог найти простой способ написать его в простом предложении. В любом случае, этот вопрос я столкнулся:Класс с частным конструктором и статическим массивом сам по себе
// header:
class SomeThing
{
private:
SomeThing() {} // <- so users of this class can't come up
// with non-initialized instances, but
// but the implementation can.
int some_data; // <- a few bytes of memory, the default
// constructor SomeThing() doesn't initialize it
public:
SomeThing(blablabla ctor arguments);
static SomeThing getThatThing(blablabla arguments);
static void generateLookupTables();
private:
// declarations of lookup tables
static std::array<SomeThing, 64> lookup_table_0;
static SomeThing lookup_table_1[64];
};
getThatThing
функция предназначена для возврата экземпляра из таблицы перекодировки.
// in the implementation file - definitions of lookup tables
std::array<SomeThing, 64> SomeThing::lookup_table_0; // error
SomeThing Something::lookup_table_1[64]; // <- works fine
Я просто не могу использовать std::array
из Something
, если я не добавить SomeThing()
общественного CTOR в классе. Он отлично работает со старыми массивами, я могу определить массив и заполнить его в функции SomeThing::generateLookupTables()
. По-видимому, у типа std::array<SomeThing, 64>
нет конструктора. Любые идеи о том, как заставить его работать, или, может быть, лучше структурировать эту концепцию?
============= EDIT =======
friend std::array<SomeThing, 64>
подход кажется хорошей идеей, но:
Он будет использоваться в массивах в других местах. Я хотел бы гарантировать, что этот класс всегда будет поддерживать определенные инварианты в отношении внешних пользователей. С помощью этого дружественного массива пользователь может случайно создать неинициализированный массив из SomeThing
.
Кроме того, таблицы поиска генерируются с использованием довольно сложный процесс, не может быть сделано в инлайн, как в std::array<SomeThing, 64> SomeThing::lookup_table_0(some value)
Рассмотрите возможность использования 'std :: vector', если ваш класс является подвижным. Если это не движется, я думаю, что 'std :: deque' по-прежнему работает, если вы выйдете на место, конечно. – Brian
Интересно, может ли это определение класса быть плохо сформированным, стандартные контейнеры должны создаваться только с полным типом. (И эта проблема возникает только из-за класса, содержащего статический член, который исходит из самого шаблона) –
Мэтт: этот стандартный контейнер еще не установлен в заголовке, а только в реализации. –