无法访问在C ++中的std ::组物体非const成员函数(Unable to access no

2019-06-24 13:59发布

消息是一类我做了。 我有我传递给messageTimeOut(和其他一些功能)的主要功能一组人。 在使用messageTimeOut的itorator我通过他们的循环和访问不同的成员函数。 然而,我只能访问消息的const成员函数的迭代器指向。 如果我尝试访问非const成员函数我得到的错误:

“以函数 'void messageTimeOut(threadParameters *)':main.cpp中:74:33:错误:使 'const的消息' 作为 '这个' 参数 '无效消息:: setTimedOut(布尔)' 丢弃限定符[-fpermissive]。 ”

这是有道理的,我无法访问一个const Message对象的非const成员函数,但我如何去使之成为一个非const的Message对象,所以我可以访问非const成员函数和更改消息? 谢谢

我的代码部分:

     [ . . . ]

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;
}

Answer 1:

你不能。

一个std ::集合中的元素是永远不变的,因为否则用户可以通过修改属于集合的元素modifiy集合中的排序。

请注意,这不要紧,你调用不改变顺序,因为的std :: set没有办法的功能进行检查。

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



Answer 2:

你不应该能够修改一个std ::集的内容。 下面是一个简化的测试案例:

#include <set>
#include <iostream>

void print(int & data) {}

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

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

锵将报告以下错误:

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) {
     ^

因此,它看起来像使用一组是不是在这里作出正确的决定。



Answer 3:

在一组对象是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 ::地图),那么你可以减少线程同步的数量。



文章来源: Unable to access non-const member functions of objects in C++ std::set