push(ing)back在循环中对象指针

push(ing)_back objects pointers within a loop

本文关键字:循环 对象 指针 back ing push      更新时间:2023-10-16

考虑以下内容:我有一个类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...
}

问题出现在我的主.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":每次我把一个新元素推回到向量中,所有现有的元素都取刚刚添加的元素的值。我还尝试使用迭代器来恢复向量中的每个元素,并获得相同的结果。有人能告诉我这里怎么了吗?

Thankx

问题是您只生成CDevice的一个实例。每次向后推,都是在向后推指向同一个实例的指针。

每次更新pDevice->Device_Name时,都会更改该设备的Device_Name。所以实际上,你有四个指针指向同一件事。你指向的是你指定的姓氏。

您需要为每个push_back制作一个新的CDevice

此外,您还需要考虑谁拥有这些新的CDevice实例。它是您的CServers类吗?如果是这样,那么在删除CServer时,它将需要删除已实例化的每个CDevice。你可以通过替换你的指针向量免费获得这种行为:

std::vector<CDevice*>

带有智能指针向量。例如:

std::vector<boost::unique_ptr<CDevice> >

在矢量中按下指针,然后更改Device_Name字段。

void push_back ( const T& x );

由于您使用指针,push_back函数会复制指针并将其推入向量,而函数不会复制指针引用的元素,因此,一个指针在代码中的向量中推入了4次。

将同一实例推送到向量上,然后重置该实例的字符串。

如果你想在矢量中有一个不同的对象,你必须创建一个新的对象:

pDevice = new CDevice;
pDevice->Device_Name = "de";
Devices.push_back(pDevice);
pDevice2 = new CDevice;
pDevice2->Device_Name = " revolotiunibus";
Devices.push_back(pDevice2);
// ...

您的示例只是一次又一次地重置同一对象中的字符串,并将同一指针推到向量上4次。

您将设备名称分配四次,但每次都分配给您拥有的唯一CDevice实例的device_name成员。最后,唯一CDevice实例的Device_Name成员具有您分配的最后一个值"coelestium"。

如果你需要四个CD设备,你必须创建其中的四个:

pDevice1 = new CDevice;
pDevice1->Device_Name = "de";
pDevice2 = new CDevice;
pDevice2->Device_Name = " revolotiunibus";
....