Я ищу метод для динамического создания новых объектов класса во время выполнения программы. Пока то, что я прочитал, наводит меня на мысль, что это нелегко и обычно зарезервировано для более сложных программных требований.
Что я пробовал до сих пор это:
// create a vector of type class
vector<class_name> vect;
// and use push_back (method 1)
vect.push_back(*new Object);
//or use for loop and [] operator (method 2)
vect[i] = *new Object;
ни одна из этих ошибок выброса из компилятора, но я использую ifstream для чтения данных из файла и динамического создания объектов … чтение файла берет какие-то странные данные и иногда читает адрес памяти, и для меня это очевидно это из-за моего использования / неправильного использования фрагмента кода выше.
Код чтения файла выглядит следующим образом:
// in main
ifstream fileIn
fileIn.open( fileName.c_str() );
// passes to a separate function along w/ vector
loadObjects (fileIn, vect);
void loadObjects (ifstream& is, vector<class_name>& Object) {
int data1, data2, data3;
int count = 0;
string line;
if( is.good() ){
for (int i = 0; i < 4; i++) {
is >> data1 >> data2 >> data3;
if (data1 == 0) {
vect.push_back(*new Object(data2, data3) )
}
}
}
}
Если вам абсолютно необходимо использовать указатели (ваши объекты хранят большие наборы данных внутри), вам следует изменить код на:
// create a vector of type class
vector<class*> vect;
// and use push_back (method 1)
vect.push_back(new Object);
//or use for loop and [] operator (method 2)
vect[i] = new Object;
Имейте в виду, что вам придется delete
ваши объекты в какой-то момент.
vector<Object> vect;
vect.push_back(Object()); // or vect.emplace_back();
Вот и все. Это правильный путь, точка. Любые проблемы, которые вы описываете при чтении объектов из файла, являются отдельным вопросом, и нам нужно было бы увидеть этот код, чтобы помочь вам понять, что не так.
Если вам нужен полиморфизм, используйте умный указатель:
vector<unique_ptr<Base>> vect;
vect.emplace_back(new Derived);
Если вы по какой-то причине ограничены в использовании умных указателей, то старомодный, подверженный ошибкам способ сделать это выглядит так:
vector<Base *> vect;
vect.push_back(new Derived);
....
for (int i=0; i<vect.size(); ++i)
{
delete vect[i];
vect[i] = NULL;
}
Это, конечно, не исключение.
vector<classType> vect;
объявляет векторный контейнер, который содержит тип classType
, но вы добавляете a pointer to classType
в vect, что сделает компилятор действительно несчастным.
Если вам нужно представить объект polymorphism
в векторном контейнере, вам нужно сохранить указатель на объект, измените ваш тип vect на:
vector<std::shared_ptr<classType> > vect;
Объявление динамических объектов использует следующий формат:
TypeName * Name = new TypeName
Вы собираетесь немного ускорить работу с вектором. Вам нужно создать новый объект класса Object, затем вставить его в вектор.
Object * MyObj = new Object //allocate space for new object
vect.push_back(MyObj) //push back new object
ПОМНИТЕ, чтобы удалить то, что вы когда-либо выделяете, что означает цикл по каждому элементу в конце, чтобы удалить его член:
for(int i = 0; i < vectLen; i++) //probably will be replaced with iterators for vectors
{
delete vect[i];
}
читать о динамическом распределении более подробно Вот