进出口。我有一个
class foo{
public:
int const * const array;
size_t const length;
}
构造后这些变量应该没有变化,包括任何成员方法,但每个人都应该可以访问这些值,所以它们应该是不变的。
但是在构造函数中,我需要在初始化数组之前先确定长度,
此外,我需要调用一个函数来分配内存位置,而不仅仅是new
,因为这个类是一个巨大的不透明数据结构的桥梁,内存是由那个人管理的。考虑某事,比如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];
}
答案 0 :(得分:1)
您需要使用构造函数成员初始化列表,如下所示:
class Test {
public:
Test(size_t length): length(length), array(func_to_allocate(length)) {}
size_t const length;
int const * const array;
};
注意:构造函数{}
的主体中没有任何内容在运行之前所有初始化都会发生。
答案 1 :(得分:0)
如果由于某种原因,您无法重新排列成员(或者这样做没有帮助),那么这就是答案。如果您可以重新安排成员,并且这样做很有帮助,那么Galik's answer就会更胜一筹。
很难从你的问题中说出来,但我会做出一系列疯狂的推测,然后展示结果代码:
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())
{}
那看起来可行吗?
答案 2 :(得分:0)
您应该初始化初始化列表中的成员:
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++
或您的编译器等效帮助自己做到这一点。