C ++向量问题

时间:2010-02-23 19:15:03

标签: c++

我有以下类声明:

class DEMData
{
private:
    int bitFldPos;
    int bytFldPos;
    const char* byteOrder;
    const char* desS;
    const char* engUnit;
    const char* oTag;
    const char* valType;
    int index;
public:
    DEMData();
    //DEMData(const DEMData &d);
    void SetIndex(int index);
    int GetIndex() const;
    void SetValType(const char* valType);
    const char* GetValType() const;
    void SetOTag(const char* oTag);
    const char* GetOTag() const;
    void SetEngUnit(const char* engUnit);
    const char* GetEngUnit() const;
    void SetDesS(const char desS[]);
    const char GetDesS() const;
    void SetByteOrder(const char* byteOrder);
    const char* GetByteOrder() const;
    void SetBytFldPos(int bytFldPos);
    int GetBytFldPos() const;
    void SetBitFldPos(int bitFldPos);
    int GetBitFldPos() const;
    friend std::ostream &operator<<(std::ostream &stream, DEMData d);
    //~DEMData();
};

我正在创建一个向量来保存上述类型的对象,如下所示:

vector<DEMData> dems;

如果我将100个对象push_back到这个向量中,那么所有100个对象将具有与第100个元素完全相同的值。

以下是代码段:

DEMData demData;
  for (i = 0; attr[i]; i += 2)
  {
      if(strcmp(attr[i],"BitFldPos") == 0)
      {
      demData.SetBitFldPos(*attr[i + 1] - '0');
      }
      else if(strcmp(attr[i],"BytFldPos") == 0)
      {
        char* pEnd;
        int tmp = strtol(attr[i + 1],&pEnd,10);
        demData.SetBytFldPos(tmp);
      }
      else if(strcmp(attr[i],"ByteOrder") == 0)
      {
        demData.SetByteOrder(attr[i + 1]);
      }
      else if(strcmp(attr[i],"DesS") == 0)
      {
      demData.SetDesS(attr[i + 1]);
      }
      else if(strcmp(attr[i],"EngUnit") == 0)
      {
        demData.SetEngUnit(attr[i + 1]);
      }
      else if(strcmp(attr[i],"OTag") == 0)
      {
        demData.SetOTag(attr[i + 1]);
      }
      else if(strcmp(attr[i],"ValTyp") == 0)
      {
        demData.SetValType(attr[i + 1]);
      }
      else if(strcmp(attr[i],"idx") == 0)
      {
        char* pEnd;
        int tmp = strtol(attr[i + 1],&pEnd,10);
        demData.SetIndex(tmp);
      }
  }

  // Insert the data in the vector.
  dems.push_back(demData);

为什么所有元素都具有相同的值?

6 个答案:

答案 0 :(得分:4)

你在循环中做push_back吗?如果没有,demData将不会改变。

如果你的push_back在循环内,则demData的值取决于attr [i]值。如果这些没有改变,demData的成员将不会改变。

答案 1 :(得分:1)

push_back()在内部进行复制,但是您的DEMData类没有复制构造函数,因此向量中的所有元素最终都指向相同的数据。修改一个时,修改全部。由于最后一个元素是最后修改的,因此您将获得镜像最后一个元素的所有元素。

HTH

答案 2 :(得分:1)

您似乎在for循环结束后调用push_back,因此只有最后一个元素将存储在向量中。这是你的意图吗?

此外,对象可能直接存储char*数组中的attr,因此请确保其中使用的内存保持有效,以后不会被覆盖/释放。

答案 3 :(得分:0)

确保在循环内为DEMData创建新值。如果你这样做:

DEMData dem;

for( int i = 0; i < 100 ; i++ )
{
    modifyDem( dem, i );
    vec.push_back(dem);
}

向量将仅包含最后一个被修改的信息(因为每次都会覆盖对象的内存)。

如果你这样做:

for( int i = 0; i < 100 ; i++ )
{
    DEMData dem;

    modifyDem( dem, i );
    vec.push_back(dem);
}

你应该是o.k。

答案 4 :(得分:0)

您应确保在每次迭代中正确修改变量attr。您的代码段不清楚,但您始终从attr读取相同的范围。如果你忘记在每次迭代时忘记改变这个变量,你每次都会在向量中得到相同的元素。

答案 5 :(得分:0)

这看起来和push_back to a Vector完全一样......这次有什么不同吗?

假设:

  1. 您包含的for循环是 在另一个0-99 for loop
  2. 里面
  3. attr []以某种方式维持 两个for循环并包含 char *或std:strings
  4. push_back的工作方式是它传入的数据副本。当你传递一个堆栈对象时,demData的所有属性都被复制,默认的复制构造函数只是复制实际的指针(这是一个简单的版本) set函数将直接通过)。因此,即使您将值设置为demData,每次都通过循环,您所做的只是在向量中生成100个项目,这些项目都指向完全相同的字符串数据:从源文件解码的最后一个数据。

    如果您发布了其中一个函数(如SetEngUnit)的代码,可以帮助确认这一点。

    选项包括:

    1. 在课堂上制作char * std :: string,它应该管理所有 为你记忆。
    2. 实施 复制构造函数和operator = for 你的班级要做深刻的复制。
    3. 确保您致电该套装 您传递的独特方法 指针每次。你需要 确保你正确或清理它 你泄漏记忆。