在循环中推送(ing)_back对象指针

时间:2012-07-10 15:10:53

标签: c++ stl

请考虑以下事项:我有一个类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

4 个答案:

答案 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";

....