Каков конструктор по умолчанию для указателя C++?

Это старый материал, но используйте 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
27
задан Milan Babuškov 29 June 2012 в 08:39
поделиться

4 ответа

Будет создан указатель NULL (0), который в любом случае является недопустимым указателем :)

23
ответ дан 28 November 2019 в 05:16
поделиться

Да, это должен быть нулевой (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
18
ответ дан 28 November 2019 в 05:16
поделиться

Выражение data_type () оценивается как инициализированный по умолчанию объект. В случае типов, отличных от POD, вызывается конструктор по умолчанию, но в случае типов POD, таких как указатели, инициализация по умолчанию эквивалентна нулевой инициализации.

Так что да, вы можете положиться на свою карту, создав NULL указатель. Для объяснения вы можете обратиться к Инициализаторы псевдоконструктора .

2
ответ дан 28 November 2019 в 05:16
поделиться

ОБНОВЛЕНИЕ: Я завершил свою программу, и та самая строка, о которой я спрашивал, иногда вызывает сбой, но на более позднем этапе. Проблема в том, что я создаю новый объект, не меняя указатель, хранящийся в 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);

Я удивлен, что никто этого не заметил.

3
ответ дан 28 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: