2012-07-10 30 views
0

考虑以下内_back对象的指针:我有一个包含,除其他类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

您正在推动同一个实例到向量,然后重置该实例的字符串。

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

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

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

// ... 

你举的例子仅仅是重置串在同一个对象,一遍又一遍,推动相同的指针到载体上4次。

+0

谢谢你们,你们是最棒的! – 2012-07-11 10:42:48

3

的问题是,你只能使CDevice一个实例。每次你推回来,你都会推回一个指向同一个实例的指针。

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

你需要作出新的CDevice为每push_back

此外,然后需要考虑谁拥有这些新CDevice实例。它是你的CServers课程吗?如果是这样,那么当CServers被删除,将需要删除已被实例化的每个CDevice。随着智能指针的载体

std::vector<CDevice*>

:您可以通过更换指针你的载体获得此行为为免费。例如:

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

0

您在矢量推进指针,然后更改设备名称字段。

void push_back (const T& x); 

既然你用指针工作,功能的push_back复制您的指针和矢量推,功能无法复制元素上指针指,所以,一个指针向量推在你的代码的4倍。

0

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

如果您需要四个CDevices你必须创建他们四人:

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

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

.... 
相关问题