0

考虑以下内容:我有一个 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 到向量中,所有已经存在的元素都取刚刚添加的元素的值。我还尝试使用迭代器以相同的结果恢复向量中的每个元素。有人可以告诉我这里有什么问题吗?

谢谢

4

4 回答 4

3

问题是您只创建了一个CDevice. 每次您向后推时,您都会将一个指针向后推到同一个实例。

每次更新时,pDevice->Device_Name您都会更改该Device_Name设备的。所以实际上你有四个指向同一事物的指针。你指向的东西是你分配给它的姓氏。

您需要CDevice为每个push_back.

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

std::vector<CDevice*>

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

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

于 2012-07-10T15:14:14.857 回答
0

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

如果您需要四个 CDevice,则必须创建其中四个:

pDevice1 = new CDevice;
pDevice1->Device_Name = "de";

pDevice2 = new CDevice;
pDevice2->Device_Name = " revolotiunibus";

....
于 2012-07-10T15:18:49.847 回答
0

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

如果要在向量中使用不同的对象,则必须创建一个新对象:

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

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

// ...

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

于 2012-07-10T15:13:16.673 回答
0

您将指针推入向量,然后更改 Device_Name 字段。

void push_back ( const T& x );

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

于 2012-07-10T15:17:02.780 回答