ilyaplot
@ilyaplot
PHP программист

Как правильно выделить память для массива классов С++?

Пищу библиотеку для Android.
Есть вот такой класс
class ButtonProcessor{
  private:
    Button buttons[];
  public:
    ButtonProcessor(Button buttons[]);
    void run();
};

Естественно, когда я пытаюсь передать аргумент конструктора в переменную, память не выделяется, потому что это было сделано ранее.
Подскажите, как выделить память под массив, если я не знаю заранее размер массива?
  • Вопрос задан
  • 2771 просмотр
Пригласить эксперта
Ответы на вопрос 2
icelaba
@icelaba
Знаю и умею всё
@Deerenaros правильно написал что не совсем понятно что вы хотите,
но при этом кусок кода
Button *buttons = new Button[100500];
ButtonProcessor proc(buttons);
вместе с конструктором по современным понятиям содержит в себе несколько ошибок.

Так лучше не делать, вам придется помнить что нужно вызывать delete[], при этом желательно вызвать delete[] уже после того как отработает деструктор ButtonProcessor (деструктор может использовать buttons), а в приведенном коде это невозможно.

До кучи инициализация переменной в теле конструктора - тоже плохой подход почитайте c++ RAII en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Resource...
Да и у конструкторов C++ есть синтакисис для инициализации name(params) : button(button) который до кучи позволяет избегать ряда проблем см пр RAII

Чтоже делать? Как вариант перестать использовать массивы в чистом виде и использовать std::vector, из стандартной библиотеки,
либо поставить boost - почитать про контейнеры буста, про смарт поинтеры, и использовать либо готовые контейнеры например boost::array, либо boost::shared_array,

Тогда проблем с памятью и т.п. вы избежите, поэтому вместо того чтобы писать код - посвятите время - и почитайте полезную литературу
Рекомендую начать с C++ faq
www.parashift.com/c++-faq
потом пробежать тут
en.wikibooks.org/wiki/More_C%2B%2B_Idioms
и почитать про boost - boost.org

После прочтения вышеперечисленного у вас не будет возникать вопросов что куда как и где.
Без всего этого код на C++ превратится для вас в непрерывную попаболь.
Ответ написан
Deerenaros
@Deerenaros
Программист, математик, задрот и даже чуть инженер
Оу вэй. Си++ умеет управлять памятью куда более изощрёнными способами, чем Java или C#, так что изучайте стек и кучу, читайте про указатели и динамическое распределение памяти.

Ваш вопрос сформулирован неправильно. Не совсем понятно, что Вы хотели сделать. Если Вам надо хранить ранее созданный массив кнопок, то передавайте указатель, а перед этим создавайте оператором new:
class ButtonProcessor{
  private:
    Button *buttons;
  public:
    ButtonProcessor(Button *buttons) {
        this->buttons = buttons;
    }
};
/***/
Button *buttons = new Button[100500];
ButtonProcessor proc(buttons);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
CTRL+ Москва
от 250 000 до 320 000 ₽
CTRL+ Москва
от 200 000 до 300 000 ₽
CTRL+ Белград
от 250 000 до 320 000 ₽
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект