Лучшие методы для динамического создания новых объектов

Я ищу метод для динамического создания новых объектов класса во время выполнения программы. Пока то, что я прочитал, наводит меня на мысль, что это нелегко и обычно зарезервировано для более сложных программных требований.

Что я пробовал до сих пор это:

// 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) )
}
}
}
}

1

Решение

Если вам абсолютно необходимо использовать указатели (ваши объекты хранят большие наборы данных внутри), вам следует изменить код на:

// 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 ваши объекты в какой-то момент.

1

Другие решения

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;
}

Это, конечно, не исключение.

4

vector<classType> vect;

объявляет векторный контейнер, который содержит тип classType, но вы добавляете a pointer to classType в vect, что сделает компилятор действительно несчастным.

Если вам нужно представить объект polymorphism в векторном контейнере, вам нужно сохранить указатель на объект, измените ваш тип vect на:

vector<std::shared_ptr<classType> > vect;
1

Объявление динамических объектов использует следующий формат:

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];
}

читать о динамическом распределении более подробно Вот

0
По вопросам рекламы [email protected]