2

Message是我做的一门课。我在传递给 messageTimeOut (和其他一些函数)的主函数中有一组它们。在使用 itorator 的 messageTimeOut 中,我遍历它们并访问不同的成员函数。但是,我只能访问迭代器指向的 Message 的 const 成员函数。如果我尝试访问非 const 成员函数,则会收到错误消息:

“在函数‘void messageTimeOut(threadParameters*)’中:main.cpp:74:33:错误:将‘const Message’作为‘void Message::setTimedOut(bool)’的‘this’参数传递会丢弃限定符[-fpermissive]。 ”</p>

我无法访问 const Message 对象的非 const 成员函数是有道理的,但我如何才能使它成为非 const Message 对象,以便我可以访问非 const 成员函数并更改 Message?谢谢

我的部分代码:

     [ . . . ]

void messageTimeOut( threadParameters* params )
{
     set<Message>::iterator it = params->messages->begin();
     [ . . . ]
    for ( ; it != params->messages->end(); ++it )
    {
        if ( (it->createdTime() + RESPONSE_WAIT) < GetTickCount() ) 
        {
            it->setTimedOut(true); // error 
        }
    }
    ReleaseMutex(sentQueueMutex);
}

     [ . . . ]

int main()
{
    threadParameters rmparameters;
    set<Message> sentMessages;
     [ . . . ]


    rmparameters.logFile = &logFile;
    rmparameters.socket = socketDesciptor;
    rmparameters.messages = &sentMessages;
      [ . . . ]

    messageTimeOut( rmparameters );
      [ . . . ]

    return 0;
}
4

3 回答 3

10

你不能。

std::set 中的元素始终是常量,因为否则用户可以通过修改属于该集合的元素来修改集合中的顺序。

请注意,您调用的函数不会更改顺序并不重要,因为 std::set 无法检查这一点。

解决此问题的常用方法是从集合中删除元素,对其进行修改,然后重新插入。另一种方法是使用地图,即使这可能会迫使您复制一些数据。

于 2012-05-19T04:18:44.387 回答
1

您不应该能够修改 std::set 的内容。这是一个简化的测试用例:

#include <set>
#include <iostream>

void print(int & data) {}

int main() {
    std::set<int> objects;

    objects.insert(3);
    print(*objects.find(3));
}

Clang 会报告以下错误:

blah.cc:14:2: error: no matching function for call to 'print'
        print(*objects.find(3));
        ^~~~~
blah.cc:4:6: note: candidate function not viable: 1st argument ('const int') would lose const qualifier
void print(int & data) {
     ^

因此,看起来使用集合并不是在这里做出的正确决定。

于 2012-05-19T04:17:34.770 回答
0

集合中的对象是 const 意味着它们是不可变的。这里有一些选项

1) Create copies of the messages in a new set
2) Remove the messages, mutate them, and put them back.
3) Remove the "timeout" field from the message.

其中我更喜欢数字 3。您试图改变消息的事实是“不良代码气味”。如果您要避免所有数据更改,而是创建一个新结构(例如 std::map),那么您可以减少线程同步的数量。

于 2012-05-21T12:45:14.560 回答