Я пытаюсь динамически создать массив объектов, но после попытки иногда не могу. Соответствующий код следующий
Весь код слишком длинный, чтобы вставить его сюда, поэтому я просто опубликую соответствующие части.
Это государство.h
#ifndef State_h
#define State_h
#include "Arduino.h"
class State{
private:
char *idText;
public:
Estado(String _idText);
Estado();
void setID();
int id;
};
#endif
Это State.cpp
#include "Arduino.h"
#include "Estado.h"
using namespace std;
Estado::Estado(String _idText){
_idText.toCharArray(idText, _idText.length()+1);
setID();
}
Estado::Estado(){}
void Estado::setID(){
char* _id = strtok(idText,":");
id = atoi(_id);
}
Это главное.ино
Satate *states;
void setup(){
int sizeParameters;
sizeParameters = //I get the user's size from keyboard and convert to int
char parametersChar;
parametersChar = //I get the user's string from keyboard and convert to char
estados = new Estado[sizeParameters];
char* token = strtok(parametrosChar, "-");
int i = 0;
while(token != NULL){
estados[i] = new Estado(token);// Here I get the error
i++;
token = strtok(NULL,"-");
}
Serial.println(estados[0].id);
}
Я жду массив объектов
Не связано: Estado
могут потребоваться дополнительные функции поддержки, чтобы позаботиться о них char *idText;
См. Правило трех для получения дополнительной информации.
Вы определяете массив Estado
следующим образом:
estados = new Estado[sizeParameters];
Каждая из этих записей имеет тип Estado
.
Затем вы идете и присваиваете что-то типа Estado*
, возвращаемое new
:
estados[i] = new Estado(token);
Это не может работать. Либо вам нужно это:
estados = new Estado*[sizeParameters];
Вместо этого это указатели, или вам нужно это:
std::vector<Estado> estados;
А затем постепенно добавляйте к нему:
estados.push_back(Estado(token));
Подход push_back
лучше, потому что вам не нужно планировать заранее, какой размер массива вам нужен, вы можете просто добавлять, когда найдете новые вещи для добавления. На практике это гораздо менее раздражает, чем требовать, чтобы пользователь заранее сообщал, сколько вещей он добавляет. Вы можете понять это, когда они закончат добавлять.
`estados = std::vector<Estado>;` недействителен.
Учитывая, что конструктор копирования или оператор присваивания не определены, а значения по умолчанию делают поверхностную копию char*
, estados.emplace_back(Estado(token));
может быть лучше.
Совет: старайтесь избегать использования массивов в стиле C и
new[]
. Вместо этого используйтеstd::vector
и другие контейнеры стандартной библиотеки. Это значительно упрощает управление памятью и может передаваться по ссылке с включенной информацией о размере.