2012-12-01 5 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++ 전문가가 아니므로 친절하십시오. 감사합니다. 당신은 객체의 사본을 작성하고 사본에 대한 모든 수정을

StoredMessage storedMsg = *it; 

여기에 있기 때문에

+0

위의 설명에 실패했습니다. msgs는 StoredMessage의 집합입니다. –

+1

질문을 언제든지 편집 할 수 있습니다. –

답변

2

는 Propbably가 발생합니다.

+0

"아마도"아닙니다. 확실히 (+1). 'StoredMessage & storedMsg = ...'는 그것을 고칠 것입니다. 그러나이 코드는 다른 방법으로는 나쁘다 ... 나는'StoredMessage' 생성자를 호출하여 그것이 어디에 그리고 얼마나 자주 호출되는지 볼 것을 제안한다. (대답은 "많이"입니다 - 예를 들어'find '를 호출 할 때마다 - 그리고 사소한 생성자로서 나쁜 것입니다.) – Nemo

+0

동의합니다. 나는 또한 명시적인 키워드로이 생성자를 표시 할 것이다. –

+0

StoredMessage 및 storedMsg를 어떻게 설정합니까? 나는 그것을 그것과 동일하게 설정하려고 노력했다. 그러나 그 const를 반환합니다. 내 목표가 메시지를 수정하는 것이라면 이는 거꾸로 보입니다. 상수를 반환하지 않는 다른 방법이 있습니까? 또한, 나는 생성자에 관해서 그것을 고려하지 않았다 ... 나는 그것을하는 방식을 수정해야 할 것이다. 고맙습니다. –