У меня есть вектор указателей на объекты, которые я перебираю, используя std :: vector :: iterator`. Поскольку возвращаемый элемент сам является указателем, я разыменовываю итератор дважды, один раз для возврата указателя и один раз для разрешения указателя на реальный объект.
Я пытаюсь вызвать функцию-член (getClass
), которая возвращает std :: string, и я пробовал и (**it).getClass()
, и (*it)->getClass()
, но оба дают мне ошибку сегментации. Я продолжаю чувствовать, что упускаю что-то очевидное.
частичный код функции:
void dataSet::createFolds()
{
// Shuffle the data vector
std::random_shuffle( m_records.begin(), m_records.end());
std::cout << "STARTING MAIN LOOP. THERE ARE " << m_records.size() << " RECORDS\n";
// iterate through the data vector and assign each to a fold
std::vector<dataRecord *>::iterator it = m_records.begin();
while (it != m_records.end())
{
std::string currentClass = (*it)->getClass(); // SEG FAULT HERE
.
.
.
}
.
.
.
}
Вектор m_records ... код
dataRecord определяется следующим образом ... код
В ответ на вопросы о заполнении вектора:
Данные читаются из текстового файла, и я действительно не хочу публиковать все целиком, если мне не нужно (212 строк), но соответствующий код для заполнения вектора приведен ниже. Конструктор для объекта dataRecord принимает вектор объектов поля. Я использую временный указатель, использую new для создания объекта, затем push_back указатель.
while ...
{
std::vector<field> fields;
// build the fields vector
for (unsigned int i = 0; i < numAttribs; ++i)
fields.push_back(field(data.at(i), attribTypes[i]));
// create the new dataRecord
dataRecord * newRecord = new dataRecord(fields);
// add the record to the set
m_records.push_back(newRecord);
++recordNum;
std::cout << "read record " << recordNum << std::endl;
}