请考虑以下事项:我有一个类CDevices,其中包含一个字符串成员
class CDevice
{
public:
CDevice(void);
~CDevice(void);
// device name
std::string Device_Name;
etc...
}
在我的代码中的其他地方我定义了另一个包含CDevices指针向量的类
class CDevice;
class CServers
{
public:
CServers(void);
~CServers(void);
// Devices vector
vector<CDevice*> Devices;
etc...
}
问题出现在main.c
的以下几行中pDevice = new CDevice;
pDevice->Device_Name = "de";
Devices.push_back(pDevice);
pDevice->Device_Name = " revolotiunibus";
Devices.push_back(pDevice);
pDevice->Device_Name = " orbium";
Devices.push_back(pDevice);
pDevice->Device_Name = " coelestium";
Devices.push_back(pDevice);
for(int i = 0; i < (int)Devices.size(); ++i)
cout << "\nLoad name = " << Devices.at(i)->Device_Name << endl;
我得到的输出是“coelestium”重复四次:每次我将一个新元素push_back到向量中时,所有已存在的元素都会获取刚刚添加的元素的值。我也尝试使用迭代器来恢复向量中的每个元素,结果相同。有人可以告诉我这里有什么问题吗?
Thankx
答案 0 :(得分:3)
问题是你只创建了CDevice
的一个实例。每次推回时,你都会推回指向同一个实例的指针。
每次更新pDevice->Device_Name
时,您都会更改该设备的Device_Name
。所以实际上你有四个指向同一件事的指针。你所指向的东西就是你给它分配的姓氏。
您需要为每个CDevice
制作一个新的push_back
。
此外,您需要考虑谁拥有这些新的CDevice实例。这是你的CServers课吗?如果是这样,那么当删除CServers时,它将需要删除已经实例化的每个CDevice。您可以通过替换指针向量来免费获得此行为:
std::vector<CDevice*>
带有智能指针向量。例如:
std::vector<boost::unique_ptr<CDevice> >
答案 1 :(得分:0)
您正在将相同的实例推送到向量,然后重置该实例的字符串。
如果您想在矢量中使用其他对象,则必须创建一个新对象:
pDevice = new CDevice;
pDevice->Device_Name = "de";
Devices.push_back(pDevice);
pDevice2 = new CDevice;
pDevice2->Device_Name = " revolotiunibus";
Devices.push_back(pDevice2);
// ...
你的例子就是一遍又一遍地重置同一个对象中的字符串,并将相同的指针推到向量上4次。
答案 2 :(得分:0)
将指针推入向量,然后更改Device_Name字段。
void push_back ( const T& x );
由于你使用指针,push_back函数复制你的指针并将其推入向量,函数不复制指针引用的元素,因此,一个指针在代码中的向量中被推送4次。
答案 3 :(得分:0)
您将设备名称分配四次,但每次都分配给您拥有的 one-and-only CDevice实例的Device_Name成员。最后, one-only-only CDevice实例的Device_Name成员具有您指定的最后一个值“coelestium”。
如果您需要四个CDevices,则必须创建其中四个:
pDevice1 = new CDevice;
pDevice1->Device_Name = "de";
pDevice2 = new CDevice;
pDevice2->Device_Name = " revolotiunibus";
....