Список инициализатора конструктора для класса с несколькими массивами (C ++ 11 в порядке, boost и std :: vector — нет)

Я еще не понимаю новый синтаксис C ++ 11 для инициализации массива в списке инициализатора конструктора. Я больше не застрял с C ++ 03, но я не могу использовать boost или std :: vector из-за программных ограничений.

Экземпляр FOO должен быть измерен вызовом конструктора и вести себя так, как если бы размеры x и y были статически известны. Новые функции C ++ 11 позволяют это?

Я не уверен, если или как std::initializer_list<> может помочь.

class FOO
{
public:
// this constructor needs to size x = count and y = count * 4
FOO(int count) :
{
// interate over x and y to give them their initial and permenent values
}
private:
const BAR x[];
const TAR y[];
};

#include "foo.h"void main(void)
{
// both need to work as expected
FOO alpha(30);
FOO * bravo = new FOO(44);
}

0

Решение

Вы не можете делать то, что пытаетесь сделать. Размеры массивов должен быть константами времени компиляции. И хотя значения, предоставляемые конструкторам в ваших конкретных случаях использования, могут быть константами времени компиляции, C ++ не может этого знать.

Кроме того, как статически типизированный язык, C ++ требует возможности вычислять размер класса во время компиляции. sizeof(Foo) должен иметь точное единственное значение. А ты не можешь.

Списки инициализаторов вам не помогут. Вы хотите два массива размера во время выполнения; это то что std::vector для. Если вам нужны массивы размера во время компиляции, вам нужно использовать тип шаблона:

template<int count>
class FOO
{
public:
FOO(initializer_list<Whatever> ilist)
{
// interate over x and y to give them their initial and permenent values
}

private:
const BAR x[count];
const TAR y[count * 4];
};

#include "foo.h"void main(void)
{
// both need to work as expected
FOO<30> alpha;
FOO<44> * bravo = new FOO<44>;
}
3

Другие решения

Помимо ответа Николя Боласа об использовании параметров шаблона для настройки размера во время компиляции, вы также можете выделить память в куче:

class FOO
{
public:
// this constructor needs to size x = count and y = count * 4
FOO(int count) : x(new BAR[count]), y(new TAR[count])
{
// interate over x and y to give them their initial and permenent values
}

// Need a destructor to free the memory we allocated in the constructor
~FOO()
{
delete [] y;
delete [] x;
}
private:
const BAR* x;
const TAR* y;
};
0

По вопросам рекламы [email protected]