Векторная обратная передача не работает внутри класса конструктора

#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/VdleXJ

5. @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 , что означает, что код, который я выполнял, не был «сохранен» для каждого высказывания. В любом случае, еще раз спасибо за помощь