Установить длину поля массива на основе целочисленного поля const

Предположим, у меня есть класс …

class Foo
{
public:
Foo(int size);

private:
const int size;
int data[];
};

Предполагая, что поле размера устанавливается сразу при создании экземпляра, как я могу установить длину data на основе этого размера ввода?

Я бы обычно использовал std::vector здесь, но я пишу библиотеку для Arduino, чтобы она не работала, и я стараюсь избегать внешних зависимостей, если могу.

1

Решение

Вам не повезло, поскольку 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
}
};
6

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

Других решений пока нет …

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