数组或向量更改C ++中的元素

时间:2018-12-07 12:03:45

标签: c++ arrays

我必须做一个作业,从console / .txt文件中读取名称,但是每次读取一行时,整个数组/向量都会更改为该特定行,元素不会保持不变。我再也不能移动了 发布我所有的代码

Pretakar.h

    #pragma once
class Pretekar
{
public:
    Pretekar(const char* priezvisko, const char* meno, const char pohlavie, unsigned int startCislo, int dosiahCas);
    Pretekar();
    virtual ~Pretekar();
    const char* getPriezvisko();
    const char* getMeno();
    const char getPohlavie();
    unsigned int getStartCislo();
    int getDosihaCas();

private:
    const char* _priezvisko;
    const char* _meno;
    const char _pohlavie;
    unsigned int _startCislo;
    int _dosiahCas;
};

Pretakar.cpp

#include "Pretekar.h"

Pretekar::Pretekar(const char * priezvisko, const char * meno, const char pohlavie, unsigned int startCislo, int dosiahCas) :
    _priezvisko(priezvisko), _meno(meno), _pohlavie(pohlavie), _startCislo(startCislo), _dosiahCas(dosiahCas)
{
}

Pretekar::Pretekar() : _pohlavie('y')
{
}

Pretekar::~Pretekar()
{
}

const char* Pretekar::getPriezvisko()
{
    return _priezvisko;
}

const char* Pretekar::getMeno()
{
    return _meno;
}

const char Pretekar::getPohlavie()
{
    return _pohlavie;
}

unsigned int Pretekar::getStartCislo()
{
    return _startCislo;
}

int Pretekar::getDosihaCas()
{
    return _dosiahCas;
}

现在我的主要问题出现在第30和58行,我想在数组中添加一个“ Pretekar”,当它发生时会更改整个数组

#include <stdio.h>
#include <iostream>
#include "Pretekar.h"
#include <vector>
#include <string>
#include <sstream>
#include <fstream>

void subor(char* argv) {
    Pretekar* pretekari[20];
    std::string menoSuboru = argv;
    std::ifstream inSubor(menoSuboru);
    std::string newLine;
    int pocitadlo = 1;
    const char* pohlavie;
    const char* meno;
    const char* priezvysko;
    while (std::getline(inSubor, newLine))
    {
        std::string buf;
        std::stringstream ss(newLine);

        std::vector<std::string> result;

        while (ss >> buf)
            result.push_back(buf);
        pohlavie = result.at(2).c_str();
        meno = result.at(1).c_str();
        priezvysko = result.at(0).c_str();
        Pretekar pretekar(priezvysko, meno, pohlavie[0], pocitadlo, 15900 + (std::rand() % (23135 - 15900 + 1)));
        pretekari[pocitadlo - 1] = &pretekar;
        pocitadlo++;
    }
}

int main(int argc, char* argv[]) {
    std::vector<Pretekar> pretekari;
    if (argc > 1)
    {
        subor(argv[1]);
    }
    else
    {
        std::string riadok;
        int pocitadlo = 1;
        while (getline(std::cin, riadok) && !riadok.empty())
        {
            std::string buf;
            std::stringstream ss(riadok);

            std::vector<std::string> result;

            while (ss >> buf)
                result.push_back(buf);
            std::string pohlavie = result.at(2).c_str();
            std::string meno = result.at(1).c_str();
            std::string priezvisko = result.at(0).c_str();
            Pretekar pretekar(priezvisko.c_str(), meno.c_str(), pohlavie.c_str()[0], pocitadlo, 15900 + (std::rand() % (23135 - 15900 + 1)));
            pretekari.push_back(pretekar);
            pocitadlo++;
        }

    }
    return 0;
}

这是添加第一个和第二个元素后数组的外观

对不起,我发布了所有代码,但我真的很困惑。

2 个答案:

答案 0 :(得分:4)

pretekari[pocitadlo - 1] = &pretekar;

这会将指向此pretekar对象的指针添加到此指针数组。

不幸的是,pretekar是在循环内部声明的对象,因此该对象在循环结束时被销毁。现在,数组中的指针指向一个已销毁的对象,该对象不再存在。

任何进一步取消引用指针的尝试都是未定义的行为,充其量只会导致垃圾。

答案 1 :(得分:0)

您的Pretekari构造函数仅复制了priezvysko的内部地址,该指针将在每次迭代结束时被破坏。

您应该使用字符串存储数据,而不是复制其临时指针:

在Pretekari类中,更改:

const char* _pohlavie;
const char* _meno;
const char* _priezvysko;

收件人:

string _pohlavie;
string _meno;
string _priezvysko; 

如果要使用Pretekari指针的矢量:

std::vector<Pretekar *> pretekari;

.... 

pretekari.push_back( new Pretekar(...) );