我必须做一个作业,从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;
}
这是添加第一个和第二个元素后数组的外观
对不起,我发布了所有代码,但我真的很困惑。
答案 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(...) );