Не могу разобраться с vector < unque_ptr <T>>

180
26 ноября 2016, 19:05

Есть класс, в котором есть поле вектора из unique_ptr (Animals - тоже класс), а так же методы чтения и записи в файл этого вектора класса. Вот фрагмент кода:

class Hendler {
private:
char* input;
char* output;
std::vector <std::unique_ptr <ModelObject>> *  Animals;
std::vector <std::unique_ptr <Event>> * E;
public:
Hendler(char* in, char* out, std::vector <std::unique_ptr <ModelObject> > *  A, std::vector <std::unique_ptr <Event> > * Ev) :
    input(in), output(out), Animals(A), E(Ev) {};
void inputing()
{
    std::fstream inputFile;
    inputFile.open(input);
    coord p, v;
    std::vector <std::unique_ptr <ModelObject> > Animals;
    // some code
    for (int i = 1; i <= D; i++)
    {
        inputFile >> p.x >> p.y >> p.z >> v.x >> v.y >> v.z;
        Animals.emplace_back(new Dragonfly(p, v, DS));
    }
    inputFile.close();
}
void outputing()
{
//some code 
        for (int i = 0; i < Animals->size(); ++i) {
            switch ((*Animals)[i]->get_type()) {
            case dragonfly:
                out << (*Animals)[i]->get_position().x
                    << ' ' << (*Animals)[i]->get_position().y
                    << ' ' << (*Animals)[i]->get_position().z
                    << ' ' << (*Animals)[i]->get_vector().x
                    << ' '
                    << (*Animals)[i]->get_vector().y << ' '
                    << (*Animals)[i]->get_vector().z << ' '
                    << '\n';
                break;
//some code
};

int main(int argc, char ** argv)
{
    std::vector <std::unique_ptr <ModelObject>> Animals;
    std::vector <std::unique_ptr <Event> > Events;
    Hendler HendlerFile(argv[1],argv[2], &Animals, &Events);
    HendlerFile.inputing();
    //Model Mod(&Animals, &Events);
    //HendlerFile.set_N(Mod.modulating(HendlerFile.get_N()));

    HendlerFile.outputing();
    return 0;
}

Но после выполнения мейна, выходной файл пруст... Понимаю, что передача в класс Handler вектора происходит не правильно, но как правильно это сделать - ума не приложу.. З.Ы. меняться должен именно вектор из main.

Answer 1

Данное объявление вектора в функции-члене класса inputing

void inputing()
{
    std::fstream inputFile;
    inputFile.open(input);
    coord p, v;
    std::vector <std::unique_ptr <ModelObject> > Animals;
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

является объявлением локальной переменной, для которой будет вызван деструктор при завершении работы функции. Член данных Animals самого класса, объявленный как

std::vector <std::unique_ptr <ModelObject>> *  Animals;

при этом никак не изменяется.

Кроме того совершенно непонятно, почему вы объявили этот член данных как указатель на вектор вместо самого объекта вектора.

Answer 2

В функции inputting у вас содается локальный vector, в который сохраняются измененния, а после выхода из функции он разрушается.

READ ALSO
Как остановить демон?

Как остановить демон?

У меня никак не получается остановить работу демона, что я и пытаюсь сделать с помощью параметра stopПодскажите, как лучше это сделать? И почему...

327
Shlobj.h актуален? [закрыто]

Shlobj.h актуален? [закрыто]

Здравствуйте! Пишу простой проводник и столкнулся с такой библиотекойВопрос такой: для написания проводника ею лучше пользоваться? И для...

185
Динамическое обновление терминала ubuntu

Динамическое обновление терминала ubuntu

Я вывожу значение постоянно обновляемой переменной в терминал в виде:

193
Динамический массив [закрыто]

Динамический массив [закрыто]

Во время первого запуска программы, количество автобусных остановок – 234, но я хочу затем поменять и посмотреть, как программа все посчитает

194