如果标题让您感到困惑,对不起。我无法找到一种简单的方式以简单的句子来表达它。不管怎样,我面临的问题是:
// 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
of Something
,除非我在类中添加一个公共构造函数SomeThing()
。传统的数组可以正常工作,我可以定义数组,并在SomeThing::generateLookupTables()
函数中填充。显然,类型std::array<SomeThing, 64>
没有构造函数。有什么办法让它工作,或者这个概念的更好结构?============= 编辑 =======
friend std::array<SomeThing, 64>
方法似乎是一个不错的想法,但是:它也将在其他地方使用数组。我希望保证这个类始终对外部用户保持某些不变量。使用此友好数组,用户可能会意外创建未初始化的
SomeThing
数组。此外,查找表是使用相当复杂的过程生成的,不能像
std::array<SomeThing, 64> SomeThing::lookup_table_0(some value)
那样执行行内操作。
std::vector
。如果它不可移动,我认为只要你使用 emplace,std::deque
仍然可以工作。 - Brian Bistd::array
简单地替换。 - M.M