2016-01-26 3 views
1

Предположим, у меня есть класс ...поле множества массива на основе Const целочисленного поля

class Foo 
{ 
public: 
    Foo(int size); 

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

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

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

+0

'new int [size];'? – tkausl

+0

Это требует от меня «удалить» его позже? – 2mac

+1

Удаление это хорошая гигиена, но не требуется. Есть ли какая-то причина, по которой вы не хотите? – Beta

ответ

6

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

Не должно быть 'std :: unique_ptr '? – immibis

+0

@immibis Да, конечно, спасибо, исправлено. – vsoftco

 Смежные вопросы

  • Нет связанных вопросов^_^