2012-12-01 31 views
1

我有以下結構:的push_back一個結構爲載體的結構

enum messageType {New = 0, Old = 1, No_Message = 2}; 

typedef struct { 
    enum messageType type; 
    unsigned int senderID; 
    char message[100]; 
} StoredMessageData; 

struct StoredMessage { 
    unsigned int recipientID; 
    vector<StoredMessageData> messages; 

    StoredMessage(const unsigned int& intRecipient = 0, const vector<StoredMessageData>& data = vector<StoredMessageData>()) 
    : recipientID(intRecipient), messages(data) 
    { 
     messages.reserve(10); 
    } 

    bool operator<(const StoredMessage& compareTo) const 
    { 
     return recipientID < compareTo.recipientID; 
    } 

    bool operator==(const StoredMessage& compareTo) const 
    { 
     return recipientID == compareTo.recipientID; 
    } 
}; 

在我的主要方法,在某些時候,我收到一條消息,並希望將其存儲像這樣:

if(msgs.find(rcvdRecipientID) == msgs.end()) 
{ 
    StoredMessage storedMsg; 
    storedMsg.recipientID = rcvdRecipientID; 
    msgs.insert(storedMsg); 
} 

set<StoredMessage>::iterator it = msgs.find(rcvdRecipientID); 
StoredMessage storedMsg = *it; 

StoredMessageData data; 
data.type = New; 
data.senderID = rcvdSenderID; 
strcpy(data.message, rcvdMessage); 

storedMsg.messages.push_back(data); 

如果在push_back()之後,我調用storedMsg.messages.size(),那麼給出的值爲1.這對我來說很有意義。

可是,後來,我想知道我保存了多少消息,因此,這段代碼:

StoredMessage storedMsg; 
if(msgs.find(rcvdSenderID) != msgs.end()) 
{ 
    storedMsg = *(msgs.find(rcvdSenderID)); 
    cout << "Number of stored messages to send: " << int(storedMsg.messages.size()) << endl << endl; 
    ... 

這裏,storedMsg.messages.size()返回0,即使是像以前一樣使用相同的ID ......我很困惑,爲什麼會發生這種情況,並且懷疑它與被複制的載體有關,因爲它們的大小各不相同,但我不確定。我不是C++專家,所以請溫和。 謝謝!

+0

上面我沒有注意到,msgs是一組StoredMessage。 –

+1

你總是可以編輯你的問題 –

回答

2

想必是因爲這裏

StoredMessage storedMsg = *it; 

創建對象的副本,並完成所有的修改,複製它發生。

+0

不是「可能」;絕對(+1)。 'StoredMessage&storedMsg = ...'會解決它。但是這個代碼在其他方面很糟糕......我建議使用'StoredMessage'構造函數來查看它被調用的位置和頻率。 (答案是「很多」 - 例如在每次調用'find'時 - 作爲一個不平凡的構造函數,這是一件壞事。) – Nemo

+0

我同意。我也會用明確的關鍵字來標記這個構造器。 –

+0

我會設置StoredMessage&storedMsg等於?我試圖設置它等於*它和它;但是那些返回一個const。如果我的目標是修改消息,這看起來倒退了。有沒有另外一種方法可以找到不會返回常量的方法?另外,我沒有考慮過有關構造函數的問題......我將不得不修改我這樣做的方式。謝謝。 –