Мой список указателей на объекты std :: string не работает правильно, и я не могу понять, почему - PullRequest
0 голосов
/ 02 октября 2011

Можете ли вы помочь мне выяснить этот код: onCreate (xMsg) вызывается WindowProcedure для сообщения WM_NCCREATE.Проблема в разыменовании итератора.Я не могу установить итератор в начало списка (), а затем получить содержимое итератора, который должен быть указателем на строку, которая может использоваться с -> c_str () в MessageBox.1002 *

1 Ответ

0 голосов
/ 03 октября 2011

Мы не приводим полный пример, но я предполагаю, что вы делаете другие манипуляции между созданием и использованием итератора.

Итераторы не гарантируются действительными после различных операций над контейнером. Вы должны не сохранить их.

Готов поспорить, что это сработает?

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

Такие вещи, как добавление, удаление и т. Д. Из контейнера, лишают законной силы итераторы. Так что просто воссоздайте итератор в каждой точке. Строки и итераторы довольно легки, поэтому вам не нужно беспокоиться об оптимизации таким способом. На самом деле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...