Я еще не понимаю новый синтаксис 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);
}
Вы не можете делать то, что пытаетесь сделать. Размеры массивов должен быть константами времени компиляции. И хотя значения, предоставляемые конструкторам в ваших конкретных случаях использования, могут быть константами времени компиляции, 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>;
}
Помимо ответа Николя Боласа об использовании параметров шаблона для настройки размера во время компиляции, вы также можете выделить память в куче:
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;
};