Это старый материал, но используйте ObservableCollection. Если вы хотите, чтобы пользовательский интерфейс видел обновления свойств в объектах ObservableCollection, вам необходимо реализовать INotifyPropertyChanged в определении класса для этого объекта. Затем создайте событие свойства изменено в установщике каждого свойства.
Public Class Session
Implements INotifyPropertyChanged
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
End Sub
Private _name As String = "No name"
''' <summary>
''' Name of Session
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
NotifyPropertyChanged("Name")
End Set
End Property
Будет создан указатель NULL
(0), который в любом случае является недопустимым указателем :)
Да, это должен быть нулевой (NULL) указатель, так как контейнеры stl по умолчанию инициализируют объекты, когда они не сохранены явно (т. Е. Доступ к несуществующему ключу на карте, как вы это делаете или изменение размера вектора до большего размера).
Стандарт C ++, пункт 5 8.5 гласит:
Для инициализации объекта по умолчанию тип T означает:
- Если T не является типом класса POD (класс предложения), значение по умолчанию вызывается конструктор для T (и инициализация неправильно сформирована, если T имеет нет доступного конструктора по умолчанию)
- Если T является типом массива, каждый элемент инициализируется по умолчанию
- В противном случае хранилище для объекта инициализируется нулем.
Также следует отметить, что инициализация по умолчанию отличается от простого пропуска конструктор. Если вы опустите конструктор и просто объявите простой тип, вы получите неопределенное значение.
int a; // not default constructed, will have random data
int b = int(); // will be initialised to zero
Выражение data_type ()
оценивается как инициализированный по умолчанию объект. В случае типов, отличных от POD, вызывается конструктор по умолчанию, но в случае типов POD, таких как указатели, инициализация по умолчанию эквивалентна нулевой инициализации.
Так что да, вы можете положиться на свою карту, создав NULL
указатель. Для объяснения вы можете обратиться к Инициализаторы псевдоконструктора .
ОБНОВЛЕНИЕ: Я завершил свою программу, и та самая строка, о которой я спрашивал, иногда вызывает сбой, но на более позднем этапе. Проблема в том, что я создаю новый объект, не меняя указатель, хранящийся в std :: map. На самом деле нужна либо ссылка, либо указатель на этот указатель.
MapIndex *mi = mapM[s]; // <- question about this line
if (!mi)
mi = new MapIndex();
mi->add(values);
следует заменить на:
MapIndex* &mi = mapM[s]; // <- question about this line
if (!mi)
mi = new MapIndex();
mi->add(values);
Я удивлен, что никто этого не заметил.