首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++向量问题

C++向量问题
EN

Stack Overflow用户
提问于 2010-02-24 03:15:03
回答 6查看 282关注 0票数 1

我有以下类声明:

代码语言:javascript
复制
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();
};

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

代码语言:javascript
复制
vector<DEMData> dems;

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

以下是代码片段:

代码语言:javascript
复制
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);

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-02-24 03:25:21

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

HTH

票数 1
EN

Stack Overflow用户

发布于 2010-02-24 03:20:46

你在做循环中的push_back吗?如果不是,demData不会改变。

如果您的push_back在循环中,则demData的值取决于attri值。如果这些不改变,demData的成员也不会改变。

票数 4
EN

Stack Overflow用户

发布于 2010-02-24 03:26:52

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2320975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档