【问题标题】:How to initialize a int const * const in constructor?如何在构造函数中初始化 int const * const?
【发布时间】:2018-04-02 23:50:35
【问题描述】:

exp。我有一个

class foo{
    public:
      int const * const array;
      size_t const length;
}

这些变量在构造后应该没有变化,包括任何成员方法,但值应该被每个人访问,所以它们应该是常量。

但是在构造函数中,我需要先确定长度,然后才能初始化数组,

此外,我需要调用一个函数来分配内存位置,而不仅仅是new,因为这个类是一个巨大的不透明数据结构的桥梁,而内存是由那个人管理的。(考虑一下. 像 v8)。

我该如何初始化?

附言让我们调用分配器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];
}

【问题讨论】:

  • 我假设您的构造函数采用const int* 参数和length 或类似的东西?如果是这样,这是微不足道的。如果没有,这是无法解决的,因为我们只知道你想要什么输出,没有任何输入。
  • "在构造函数中,我需要先确定长度,然后才能初始化数组,"正确。就这样做吧。有什么问题?
  • 在您的代码中看不到构造函数。
  • @RemyLebeau 我考虑过这种方式,在这种情况下我需要将每个成员方法标记为'const',并且我还需要为这些值编写getter并将它们标记为私有。
  • @YongjianWang 您显示的循环将不起作用,因为array 指向的const 值无法分配给

标签: c++ constructor constants


【解决方案1】:

你需要像这样使用构造函数的成员初始化列表

class Test {

    public:
    Test(size_t length): length(length), array(func_to_allocate(length)) {}

    size_t const length;
    int const * const array;
};

注意:构造函数{} 的主体中没有任何内容,所有初始化都发生在运行之前

【讨论】:

  • 但是我不能使用'new',我知道我可以这样做,但是我不能使用new
  • @YongjianWang:那就不要了。只需拨打bar() 代替:array(static_cast&lt;int const *&gt;(bar(length)))
  • 您不需要重新排序成员(尽管这看起来更清晰),只要您知道您使用的是 length 参数(而不是 length 成员)在构造函数中。 OTOH,如果 length 以某种方式计算(昂贵)而不是作为构造函数参数提供,则重新排序可能很有用。
【解决方案2】:

如果由于某种原因您无法重新排列成员(或者这样做没有帮助),那么这就是答案。如果您可以重新排列成员并且这样做会有所帮助,那么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())
{}

看起来可行?

【讨论】:

    【解决方案3】:

    你应该在初始化列表中初始化成员:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2011-03-28
      相关资源
      最近更新 更多