2016-11-08 4 views
0

Я пытаюсь привыкнуть к C++. Я хочу добавить объект в динамический массив каждый раз, когда я читаю строку из файла, не зная размерности.Инициализация объекта на лету C++

Я объявил указатель на массив так:

Rlmr *myArray; 

где Rlmr является классом с общественной строкой в ​​качестве идентификатора.

Теперь я прочитал файл построчно и после этого я хочу, чтобы добавить объект туАггау

 index = 0; 
     while (fgets(buffer, MAXSIZEBUFFER, fp) != NULL) { 
      if(buffer[0] == '#') // Skip comment lines 
       continue; 
      else { 
       sscanf(...); 
       index++; 
      } 
     // At this point I want a new object in the array 
     myArray = (Rlmr*) malloc(sizeof (Rlmr) * index); 
     // Here I try to call the object constructor by passing the id 
     myArray[index-1] = new Rlmr(cBeacId); 
     } 

Я не понимаю, то ошибка от компилятора:

error: no match for âoperator=â in â*(myArray+ ((unsigned int)(((unsigned int)index) * 28u))) = (operator new(28u), (<statement>, ((Rlmr*)<anonymous>))) â

Что не так. И как это можно сделать с помощью std :: vector. Я хотел бы понять оба пути, спасибо.

+7

Некоторые вещи ошибочны. 'Malloc'. 'malloc' - это C, а не C++. Код C++ использует 'new'. Кроме того, вы даже не должны использовать 'malloc' или' new', но вы должны использовать 'std :: vector', и пусть это беспокоится о автоматическом изменении размера вашего массива. Если вы хотите «привыкнуть к C++», лучший способ сделать это - научиться правильно использовать контейнеры на C++. Современный C++-код редко требует динамического выделения любой памяти.И если вы хотите использовать способ использования 'std :: vector', ваша книга на C++ даст гораздо лучшее объяснение, чем краткий ответ на stackoverflow.com –

+0

... особенно если книга взята из [списка хороших книг на C++ ] (http://stackoverflow.com/q/388242/1782465) – Angew

ответ

1

Что не так? new возвращает указатель. В следующей строке вы пытаетесь присвоить указатель на существующий объект:

myArray[index-1] = new Rlmr(cBeacId); 

Вместо этого вы должны написать:

new (myArray + index - 1) Rlmr(cBeacId); 

, который называется «размещение new» (см here). Это решает вашу проблему, но никого не должно удовлетворять.

Во-вторых, как сделать это с vector:

std::vector<Rlmr> data; 

while (fgets(buffer, MAXSIZEBUFFER, fp) != NULL) { 
    if(buffer[0] == '#') // Skip comment lines 
     continue; 
    else { 
     sscanf(...); 
    } 
    data.emplace_back(cBeacId); 
} 

Подробная информация о vector например. vector::emplace_back доступны here.

1

Прежде всего, не используйте malloc для динамического распределения объектов. Вместо этого используйте new (или new[] при распределении массива).

Теперь для вашей проблемы. Массив - это массив объектов, а не массив указателей на объекты. И new Rlmr(cBeacId) приводит к указателю * to a Объект Rlmr`. Вот почему вы получаете сообщение об ошибке.

Один из способов решения вашей проблемы - использовать std::vector (который всегда должен быть контейнером по умолчанию «идти в»). Затем вы можете сделать что-то вроде

std::vector<Rlmr> myArray; 

while (...) 
{ 
    ... 
    myArray.emplace_back(cBeacId); 
} 

Кроме того, вы действительно должны научиться использовать стандартные C++ поток объектов и класс строк. В конечном итоге это сделает вашу жизнь программистом на C++ намного проще, особенно когда вы можете начать использовать некоторые из standard algorithm functions творчески.