我有以下类声明:
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);
为什么所有元素都具有相同的值?
答案 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完全一样......这次有什么不同吗?
假设:
push_back的工作方式是它传入的数据副本。当你传递一个堆栈对象时,demData的所有属性都被复制,默认的复制构造函数只是复制实际的指针(这是一个简单的版本) set函数将直接通过)。因此,即使您将值设置为demData,每次都通过循环,您所做的只是在向量中生成100个项目,这些项目都指向完全相同的字符串数据:从源文件解码的最后一个数据。
如果您发布了其中一个函数(如SetEngUnit)的代码,可以帮助确认这一点。
选项包括: