push(ing)back在循环中对象指针
push(ing)_back objects pointers within a loop
考虑以下内容:我有一个类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";
....
- 使用循环创建类对象
- 如何在C++中循环访问未知对象方法?
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 有没有办法在C++中循环访问对象的不同数据成员
- Pybind11:使用 for 循环使用 OpenMP 访问 python 对象
- 如何在 c++ 中使用 for 循环输出矢量中的所有对象
- 涉及全局对象的循环依赖C++
- c++ 循环访问对象列表并删除对象
- 循环访问对象列表 c++
- 在C++中使用循环创建多个对象
- 我想在 C++ 中使用 for 循环创建类对象
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- 在 While 循环中重用对象的多线程
- C++ 在地图上循环 - 消失的对象
- 基于范围的 for 循环将对象移动到另一个容器中?
- 在游戏循环中创建类对象
- 访问类的 std::vector 与 for 循环中的 custum 类对象
- 如何在循环中动态创建类对象?
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 创建内/外循环对象:分配和速度