如何在构造函数中初始化int const * const?

时间:2018-04-02 23:50:35

标签: c++ constructor const

进出口。我有一个

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];
}

3 个答案:

答案 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++ 或您的编译器等效帮助自己做到这一点。