Предположим, у меня есть класс …
class Foo
{
public:
Foo(int size);
private:
const int size;
int data[];
};
Предполагая, что поле размера устанавливается сразу при создании экземпляра, как я могу установить длину data
на основе этого размера ввода?
Я бы обычно использовал std::vector
здесь, но я пишу библиотеку для Arduino, чтобы она не работала, и я стараюсь избегать внешних зависимостей, если могу.
Вам не повезло, поскольку C ++ должен знать размер массива во время компиляции (другими словами, size
должно быть постоянным выражением). Вы можете использовать динамическое распределение
int* data;
затем выделить с new int[size];
в списке инициализации конструктора, или, лучше, использовать std::unique_ptr<>
(C ++ 11 или более поздняя версия), которая является легкой оболочкой вокруг необработанного указателя и удаляет выделенную память при выходе из области, поэтому вам не придется делать это вручную delete[]
class Foo
{
private:
std::unique_ptr<int[]> data; // no need to manually delete
public:
Foo(int size): data{new int[size]} {}
};
Третий вариант — сделать Foo
нетиповый шаблонный класс (при условии, что вы знаете размер во время компиляции, что, по-видимому, и происходит, по крайней мере, исходя из вашего вопроса)
template<std::size_t size>
class Foo
{
int data[size];
public:
Foo()
{
// constructor here
}
};
Других решений пока нет …