#c #vector #constructor
#c #вектор #конструктор
Вопрос:
Проблема
(Прошу прощения, если я использую неправильную терминологию, я привык к конструкторам Java и только недавно попытался реализовать их на C )
У меня есть вызываемый класс конструктора FileHandler
, который создаст новый экземпляр a FileHandler
с двумя векторами внутри него (конструктор был отключен, так как есть много постороннего кода, не относящегося к этой проблеме):
class FileHandler {
public:
std::vector<std::string> fullPath, fileNames;
FileHandler() {
//Creates two vectors
fullPath;
fileNames;
}
Насколько мне известно, это должно создать два вектора внутри экземпляра FileHandler
, с которыми можно нормально манипулировать. Однако из отдельного файла я вызываю .push_back()
метод (опять же, уменьшенный):
// This vector is pre-made and pre-filled before this is called,
// and I have verified it _is_ filled
std::vector<FileHandler> fileHandlers;
FileHandler testInstance = fileHandlers.at(index);
testInstance.fullPath.push_back("a_string_here");
std::cout << testInstance.fullPath.at(0);
И я получаю следующую ошибку (во время выполнения):
std::out_of_range at memory location 0x00000...
Что я пробовал до сих пор
У меня было подозрение, что ему может не понравиться попытка push_back
извне конструктора, поэтому я создал отдельную функцию внутри конструктора:
void addFullPath(std::string fullPath) {
this->fullPath.push_back(fullPath);
}
Однако передача строки аналогично предыдущей:
std::vector<FileHandler> fileHandlers;
FileHandler testInstance = fileHandlers.at(index);
testInstance.addFullPath("a_string_here");
std::cout << testInstance.fullPath.at(0);
Все еще выдает мне ту же out_of_range at memory location
ошибку.
Это подразумевает (по крайней мере, для меня), что вторая строка; будучи .push_back()
методом, не функционирует должным образом. Моя основная гипотеза на данный момент заключается в том, что я не создаю экземпляры векторов в конструкторе в правильном формате или что векторы нельзя редактировать, однако я пока не уверен. Пожалуйста, сообщите.
Комментарии:
1. Отладчик может сказать вам наверняка. Не нужно гадать. Также стоило бы изучить как инициализацию элемента по умолчанию, так и раздел инициализации конструктора.
2. @sweenish Я посмотрю на оба, спасибо!
3. Какова цель
fullPath; fileNames;
в теле конструктора? Это ничего не даст. это, конечно, не создаст векторы (они уже созданы при вводе тела конструктора).4.
FileHandler testInstance();
это ошибка компиляции из-за того, какtestInstance
используется впоследствии.. Удалите()
в конце, чтобы оно не анализировалось как объявление функции. Конструктор ничего не делает, вы тоже можете его удалить. В противном случае это работает для меня: ideone.com/VdleXJ5. @RetiredNinja Мой истинный код работает с вектором обработчиков файлов, поэтому в конструкторе есть заполнитель. Я отредактирую сообщение сейчас, чтобы отразить это, поскольку это довольно уместно.
Ответ №1:
После запуска следующего аналогичного фиктивного кода все работало нормально. В другом месте постороннего кода, который вы не показали, может быть ошибка.
#ifndef UNTITLED_MYCLASS_H
#define UNTITLED_MYCLASS_H
#include <string>
#include <vector>
class MyClass {
public:
std::vector<std::string> a,b;
MyClass();
};
#endif //UNTITLED_MYCLASS_H
#include "MyClass.h"
MyClass::MyClass() {} //the vectors are dynamic and don't require initialization here
#include <iostream>
#include "MyClass.h"
int main()
{
// should not be file() which is a function call for the default constructor
MyClass file; //declares default object instance
file.a.push_back("a string");
std::cout << file.a.at(0);
return 0;
}
untitledcmake-build-debuguntitled.exe
a string
Process finished with exit code 0
Комментарии:
1. Я только что отредактировал свой пост с дополнительной информацией, которая может повлиять на это, в основном относящейся к тому факту, что my
testInstance
выбирается из вектораFileHandler
s
Ответ №2:
Проблема решена:
Моя проблема заключалась в следующей строке кода:
FileHandler testInstance = fileHandlers.at(i);
Я ошибочно предположил, что testInstance
он унаследует все свойства fileHandlers.at(i)
, что сделает его полностью пригодным для использования, однако это было не так. Замена:
FileHandler testInstance = fileHandlers.at(index);
testInstance.fullPath.push_back("a_string_here");
std::cout << testInstance.fullPath.at(0);
С:
fileHandlers.at(index).fullPath.push_back("a_string_here");
std::cout << fileHandlers.at(index).fullPath.at(0);
Дает ожидаемые результаты.
Комментарии:
1. Оба они должны давать одинаковый результат для приведенных фрагментов. Сначала создается копия
Filehandler
, а затем изменяется копия. Второй изменяетFilehandler
fileHandlers
непосредственно в векторе. Это различие важно, но для показанного кода это не имеет значения. Еще раз я предполагаю, что это не тот фактический код, с которым у вас возникли проблемы, или вы не показали что-то важное оFilehandler
классе. Я чувствую, что вы случайно исправили проблему и просто немного пнули банку по дороге, но в любом случае удачи.2. @RetiredNinja Мне потребовалось немного времени, чтобы понять, что здесь происходит, и, честно говоря, это был большой мозговой штурм с моей стороны. Создание экземпляра не было проблемой, но после запуска кода на экземпляре я никогда не устанавливал
vector.at(i) = instance
, что означает, что код, который я выполнял, не был «сохранен» для каждого высказывания. В любом случае, еще раз спасибо за помощь