结构向量仅返回最后一个值

时间:2017-03-11 15:51:57

标签: c++ pointers vector reference structure

抱歉,我无法粘贴完整的代码,但我会尽力解释问题。我有一个结构向量。我将向量传递给一个函数,该函数用结构填充向量并返回向量。但是当我尝试访问向量元素时,我只得到插入的最后一个元素。我认为问题在于我存储结构的地址,因此向量只保留最后一个值,但我不知道如何纠正这个。

这是我的结构:

 struct NA
 { element1;
   element2;
 };

以下是我在声明后传递矢量的方法:

Vector<NA> del;
func(del);

这是我的函数:(q是一个包含存储过程结果的变量

 func(Vector<NA> &dels)
{  
  NA& del(*new NA);
  while(q.nextquery())
   {
     while(q.nextrow())
     {
       q.bind(del.element1);
       q.bind(del.element2);
       dels.insert(&del);
     }
    return dels.entries()
 }

2 个答案:

答案 0 :(得分:0)

NA& del(*new NA);
while(q.nextquery())
     dels.insert(&del);

显然,您只创建了一个del对象,但是在同一个向量中多次插入它。最后,所有向量的条目都将指向同一个对象。

您想要的是为向量中的每个条目创建一个新的del对象。因此,将创建语句放在循环中。

func(Vector<NA> &dels)
{  
  while(q.nextquery())
   {
     while(q.nextrow())
     {
         NA& del(*new NA); // <-- Here
         q.bind(del.element1);
         q.bind(del.element2);
         dels.insert(&del);
     }
     return dels.entries()
 }

答案 1 :(得分:0)

func()正在将单个指针的多个副本推送到向量中的单个动态分配对象。每个循环迭代都在修改同一个对象,因此向量中的每个条目最终都会指向最后读取的查询记录的数据。

尝试更像这样的东西:

func(Vector<NA> &dels) {
    while(q.nextquery()) {
        while(q.nextrow()) {
            NA *del = new NA;
            q.bind(del->element1);
            q.bind(del->element2);
            dels.insert(del);
        }
    }
    return dels.entries();
}

另一方面,为什么要在向量中存储指针?并使用非标准的矢量类?将实际对象存储到标准std::vector类中会更安全:

void func(std::vector<NA> &dels) {
    while(q.nextquery()) {
        while(q.nextrow()) {
            NA del;
            q.bind(del.element1);
            q.bind(del.element2);
            dels.push_back(del);
        }
    }
}