你能帮我搞清楚这段代码: onWreate(xMsg)由WindowProcedure在WM_NCCREATE消息上调用。问题在于迭代器解除引用。我似乎无法将迭代器设置为列表的begin(),然后获取迭代器的内容,该迭代器应该是一个指向字符串的指针,该字符串可以与MessageBox中的 - > c_str()一起使用。
class MyController
{
public:
MyController() { }
~MyController() { }
void onCreate(xMessage *msg);
protected:
std::list<std::string *> m_stringlist;
std::list<std::string *>::iterator m_stringlistiter;
};
void onCreate(xMessage *msg)
{
std::string *first_string = new std::string("Hello world");
m_stringlist.push_back(first_string);
// This is where my iterator comes into play and it doesn't seem to do the trick.
m_stringlistiter = m_stringlist.begin();
MessageBox(NULL, (*m_stringlistiter)->c_str(), "Title", MB_OK);
}
答案 0 :(得分:0)
我们没有给出完整的示例,但我假设您正在创建和使用迭代器之间进行其他操作。
在容器上进行各种操作后,不保证迭代器有效。你应该不保存它们。
我愿意打赌这会有效吗?
class MyController
{
public:
MyController() : title("Hello World") {}
void onCreate(xMessage *msg);
{
MessageBox(NULL, title.c_str(), "Title", MB_OK);
}
protected:
std::string title; // generic lists of strings with
// magic indexes are hard to maintain.
};
这也更容易阅读和调试,这比软件开发的任何其他部分都要贵很多。
在大多数情况下,您应该使用迭代器作为临时对象。它们很少超出函数/方法的范围。
struct some_struct {
some_struct() {
gui_text.push_back( std::string("Hello World!") );
}
void some_function() {
std::list<std::string>::iterator iter = gui_text.begin();
for (; iter != gui_text.end(); iter++) {
std::cout << *iter << std::endl;
}
}
std::list<std::string> gui_text;
};
从容器中添加,删除等内容将使迭代器无效。所以只需在每个点重新创建迭代器。字符串和迭代器非常轻量级,因此您无需担心以这种方式进行优化。真。