- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我对 C 和 C++ 比较陌生,我更习惯于 C#。
基本上,我有一个 vector ,一个名为 CTe 的对象,这个对象有几个变量和一个名为 NFe 的另一个对象的 vector ,我想要填充 CTes 对象的所有信息都存储在一个二维字符串 vector 中,所以这个循环的目标是遍历 vector 的所有行,每行一个 CTe,这个 CTe 可能有一个或多个 NFes 附加到它。
/*The declaration of the vectors, just to help visualize the structure
vector < string > dirlist;
vector < vector < string > > listElement;
vector < CTe > ctes;*/
//This will iterate through the 2D vector
for (int i = 1; i < listElement.size(); i++)
{
//Temporally CTe object to store information
CTe temp;
string targetCNTR = listElement[i][6];
int countNFE = 0;
bool haveFoundReference = false;
// This will iterate reading all the xmls I have in a folder
for (int j = 2; j < dirlist.size(); j++)
{
string extraInfoNFE = ReadXML(dirlist[j], "infAdic", "infCpl");
//Check if a valid xml was found.
if (extraInfoNFE.find(targetCNTR) != string::npos)
{
haveFoundReference = true;
string sColeta = "000"+listElement[i][3];
stringstream tipoNumber (listElement[i][4]);
//Fill the variables of the temp object
temp.cntr = targetCNTR.c_str();
temp.booking = listElement[i][0].c_str();
temp.motorista = listElement[i][1].c_str();
temp.placas = listElement[i][2].c_str();
temp.coleta = sColeta.c_str();
temp.seqEndereco = listElement[i][5].c_str();
tipoNumber >> temp.tipoCTE;
listElement[i][8+countNFE] = ReadXML(dirlist[j], "ide", "nNF");
//Create a temporally object to store the NFe information
NFe tempNFe;
//Fill the tempNFe object
stringstream nfeNumber (listElement[i][8+countNFE]);
nfeNumber >> tempNFe.numeroNFE;
string sXML = dirlist[j].substr(5, 43);
tempNFe.codigoXML = sXML.c_str();
string sDest = ReadXML(dirlist[j], "dest", "xNome");
tempNFe.destinatario = sDest.c_str();
stringstream cfopNumber (ReadXML(dirlist[j], "det", "prod", "CFOP"));
cfopNumber >> tempNFe.cfop;
stringstream qtdeNumber (ReadXML(dirlist[j], "transp", "vol", "qVol"));
qtdeNumber >> tempNFe.qtde;
stringstream valorNumber (ReadXML(dirlist[j], "total", "ICMSTot", "vNF"));
valorNumber >> tempNFe.valor;
stringstream pesoNumber (ReadXML(dirlist[j], "transp", "vol", "pesoB"));
pesoNumber >> tempNFe.pesoBruto;
//push_back the tempNFe into the temp object
//This part is working perfectly
temp.notas.push_back(tempNFe);
countNFE++;
}
}
//Check if a valid xml was found, if so push_back
//The temp object into the ctes object
//HERE LIES THE PROBLEM
if (haveFoundReference)
{
cout<<temp.cntr<<" - ";
ctes.push_back(temp);
}
else
{
cout << "Não foi possível localizar a nota do CNTR " <<targetCNTR;
}
}
问题是,ctes vector 中的所有 CTe 对象都是相同的,唯一起作用的是 CTe 中的 NFe vector 。
这是 CTe 和 NFe 类:
非金融实体
class NFe
{
public:
NFe();
const char* codigoXML;
const char* destinatario;
int numeroNFE;
int cfop;
int qtde;
float valor;
float pesoBruto;
~NFe();
};
CTE
#include <nfe.h>
#include <vector>
class CTe
{
public:
CTe();
const char* motorista;
const char* placas;
const char* booking;
const char* cntr;
const char* seqEndereco;
const char* coleta;
int espelho;
int tipoCTE;
std::vector < NFe > notas;
virtual ~CTe();
};
最佳答案
正如我之前在评论中提到的,c_str()
返回的char *
仅在相应的字符串对象被销毁或修改之前有效。在你的情况下,
string targetCNTR = listElement[i][6];
在 vector 中创建字符串的拷贝,并在退出 for 循环后立即销毁该拷贝。所以
temp.cntr = targetCNTR.c_str();
一旦 targetCNTR
在退出作用域后被销毁,它就无效。
如果您无法修改类定义以将 const char *
更改为 std::string
并且如果 vector listElement
在整个过程中保持有效在程序的生命周期内,您可以通过获取对实际字符串的引用来修复代码,如下所示
string &targetCNTR = listElement[i][6];
这样,只要 listElement
vector 未被破坏或修改,返回的 c_str()
就会有效。如果 istElement
被修改/销毁(您没有提供填充 listElement
的代码,所以它不明显),您还可以创建 char * 的拷贝
像这样
/* allocate a new char * on heap */
char *cntr = new char [strlen(targetCNTR.c_str()) + 1];
/* copy the c string */
strcpy(cntr, targetCNTR.c_str());
/* move the char * to desired object */
temp.cntr = cntr;
您可以对所有 char *
变量执行相同的操作。如果您使用这种方法,请记住在类析构函数中释放 char *
。例如,
class CTe
{
public:
CTe();
const char* motorista;
const char* placas;
const char* booking;
const char* cntr;
const char* seqEndereco;
const char* coleta;
int espelho;
int tipoCTE;
std::vector < NFe > notas;
virtual ~CTe() {
/* free char * */
delete [] motorista;
delete [] placas;
delete [] booking;
delete [] cntr;
delete [] seqEndereco;
delete [] coleta;
}
};
关于具有奇怪行为的 C++ std::vector push_back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58945605/
这个问题在这里已经有了答案: Passing by value vs const & and && overloads (3 个答案) 关闭 8 年前。 为什么push_back的函数签名如下? v
代码如下: std::vector s; s.push_back(~Dword(0)); 什么是~Dword?它是如何工作的? 最佳答案 Dword 这里是一个数字类型(可能是 DWORD 的类型别名
我正在测试 C++ 中推回对象与推回对象指针到 Vector 之间的性能差异。 我在 Stackoverflow 和其他文章中读到,您应该避免向后推指针,除非您必须这样做... 但是,我意识到推回指针
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个很大的 .txt 文件,需要加载并存储在 vector 中。该文件大小约为 5MB,500 000 行,每行约 10-20 个字符,以 '\n' 分隔。我正在使用以下示例代码对读取整个文件所需
这个问题在这里已经有了答案: What is object slicing? (18 个答案) 关闭 9 年前。 我有这两个类: class A { public: A(); vir
在我当前的代码中,我想将新的 DrawObjects 插入到我创建的 vector 中, std::vector 对象; 有什么区别: objects.push_back(DrawObject(nam
我将 Cygwin 与 GCC 一起使用,最终我想将字 rune 件读入字符 vector ,并使用此代码 #include #include #include using namespace
以下代码创建一个临时对象 A 并将其推送到一个 vector 中。 在 push_back 期间删除复制构造函数并调用移动构造函数。我不确定这段代码的设计是否正确,肯定存在内存泄漏。 #include
我知道push_back可以抛出bad_alloc异常,并且如果没有try catch block ,则调用析构函数是不正确的。如果有任何push_back抛出并且它不在try catch block
正如 Scott Meyers 所指出的(http://channel9.msdn.com/Events/GoingNative/2013/An-Effective-Cpp11-14-Sampler
我正在写一个 push_back将临时容器添加到另一个容器的函数。 并且它应该在使用 push_back 之前调整或保留容器(如果两者都可用,它应该更喜欢保留而不是调整大小) 当前代码是: names
这个问题在这里已经有了答案: Create an array when the size is a variable not a constant (2 个答案) 关闭 3 年前。 我认为我在代码中
代码: // test2.cpp #include #include struct test_class { test_class() = default; test_class(
我试图在 forloop 的 vector 中推回一个 const char*。 char_temp 是一个名为 segment 的结构,而 chars_temp 是一个结构 vector 。请参阅下
在 C++ 入门书第 (3) 章中,有以下 for 循环将 vector 中的元素重置为零。 vector ivec; //UPDATE: vector declaration for (vector
class A { public: A():a(0) {} A(int x):a(x) { coutve
我正在尝试使用 Visual Leak Detector 查找内存泄漏。它告诉我 m_neighbors.push_back(ent);导致泄漏。 (简短调用堆栈 = NeighborCalculat
我们正在制作一个包含棋盘游戏信息(名称、年份、分数)的列表。我们从 .csv 文件中扫描信息,根据该信息创建一个结构,然后将该结构添加到列表中。我们一直这样做,直到文档阅读完毕。问题是列表的 push
以下代码是将“非重叠”的 TablePath 从 vector v 移动到 vector u。我在“u.push_back(*it1);”行遇到段错误。我没有复制对象(而是只复制对象的指针)所以我相信
我是一名优秀的程序员,十分优秀!