exp。我有一个
class foo{
public:
int const * const array;
size_t const length;
}
构建后这些变量不应发生任何更改,包括任何成员方法,但每个人都应访问这些变量,因此它们应该是恒定的。
但是在构造函数中,我需要先确定长度,然后才能初始化数组,
此外,我需要调用一个函数来分配内存位置,而不仅仅是new
,因为此类是通向巨大不透明数据结构的桥梁,并且该内存由该人管理。(考虑STH。v8(。
如何初始化?
P.S。让我们只调用分配器void * bar(size_t)
,然后构造函数(也许(看起来像:
foo(size_t const len, int const *arr) {
this->array = reinterpret_cast<int *> (bar(len));
this->length = len;
for(size_t i = 0; i < len; i++) array[i] = arr[i];
}
您需要使用构造函数的成员初始化器列表这样:
class Test {
public:
Test(size_t length): length(length), array(func_to_allocate(length)) {}
size_t const length;
int const * const array;
};
注意:构造函数{}
的正文中没有任何初始化发生在运行之前。
如果出于某种原因,您无法重新排列成员(或者这样做是没有帮助的(,那么这就是答案。如果您可以重新排列成员,并且这样做很有帮助,那么Galik的答案就优越了。
很难从您的问题中分辨出来,但是我要进行一系列狂野的猜测,然后显示由此产生的代码:
class bridge {
public:
int const * const array;
size_t const length;
bridge(const sourceType& source);
private:
static int const* init_array(const sourceType& source);
};
int const* bridge::init_array(const sourceType& source) {
int len = source.getLength();
int* arr = static_cast<int*>(bar(len));
fill(arr, len);
return arr;
}
bridge::bridge(const sourceType& source) :
array(init_array(source)),
length(source.getLength())
{}
看起来可行?
您应该在初始化器列表中初始化成员:
foo(size_t const len, int const *arr)
: array(reinterpret_cast<int*>(bar(len))),
length(len)
{
for(size_t i = 0; i < len; i++) array[i] = arr[i];
}
您可以使用 g++ -Weffc++
或您的编译器的等效方式来帮助自己正确解决此问题。