1

私は次の構造体を持っています:

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() は、以前と同じ ID が使用されている場合でも 0 を返します...なぜこれが起こっているのか混乱しており、サイズが異なるためコピーされるベクトルに関係していると思われますが、私はわからない。私は C++ の専門家ではないので、お手柔らかにお願いします。ありがとうございました!

4

1 に答える 1

2

多分ここだから起こる

StoredMessage storedMsg = *it;

オブジェクトのコピーを作成し、そのコピーに対してすべての変更を行います。

于 2012-12-01T20:23:07.400 に答える