Сразу скажу - заголовок неправильный. Скажите правильный - переименую.
Итак, имеем класс, который принимает два параметра - ссылку на массив и размер массива. Соответственно его конструктор выглядит так:
Axa(byte par_count, byte* par_list);
Я хочу, чтобы в случае, когда массив состоит всего из двух элементов, его можно было вызывать так:
Axa(byte p1, byte p2);
Удобно было бы делать это через делегирующий конструктор:
Axa(byte par_count, byte* par_list); // основной конструктор
Axa(byte p1, byte p2) : Axa(2, /* массив {p1, p2} */ );
Собственно вопрос - как правильно сгенерить массив из параметров p1 и p2 прямо при вызове конструктора?
Сперва я хотел сделать так, вроде когда-то так работало:
Axa(byte p1, byte p2) : Axa(2, (uint8_t[2]) {p1, p2});
Но оказалось, что это был синтаксис С, а в С++ так нельзя. Пишет ошибку “взятие адреса временного массива”.
В итоге я придумал костыль - создаю в этом месте динамический массив через new. Это работает - но не понятно, правильно ли это? И в какой момент я должен вызывать delete для этого массива?
Полный код:
class Axa
{
public:
Axa(byte par_count, byte* par_list): count(par_count), list (par_list) {}
Axa(byte p1, byte p2) : Axa(2, new uint8_t[2]{p1, p2}) {}
const uint8_t count =0;
uint8_t* list;
uint16_t summ() {
uint16_t res =0;
for (byte i = 0; i < count; i++) res += list[i];
return res;
}
};
uint8_t a[4] = {1,2,3,4};
Axa Axa1(4,a);
Axa Axa2(2,4);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println(Axa1.summ());
Serial.println(Axa2.summ());
}
void loop() {
// put your main code here, to run repeatedly:
}
Печатает 10 и 6 - правильный ответ.