2012-07-10 54 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"; 

.... 
相關問題