Базовый C ++: как инициализировать член структуры класса? - PullRequest
3 голосов
/ 01 ноября 2010

Я посмотрел повсюду, но не нашел ответа на этот вопрос.

У меня есть класс C ++ с этими защищенными членами:

 struct tm  _creationDate;
 struct tm  _expirationDate;
 struct tm  _lockDate;

Я хочуинициализируйте их во время создания экземпляра.Если я добавлю это в конструктор:

 _creationDate = {0};
 _expirationDate = {0};
 _lockDate = {0};

, то компилятор скажет: "ожидаемое первичное выражение до '{' token"

Я также не могу найти способ сделать это всписок инициализаторов элементов в верхней части конструктора.Как это сделать?Спасибо!

ПОСЛЕДОВАТЕЛЬНОСТЬ: Спасибо за ответы, ребята.Вы не можете сделать это в декларации;это не разрешеноТаким образом, единственным способом является установка memset или индивидуальная настройка членов.Я закончил тем, что написал полезную функцию, чтобы сделать это.

Ответы [ 4 ]

2 голосов
/ 01 ноября 2010

Вы можете сделать это при объявлении, как это

_creationDate = {0}; // set everything to 0's

или как это

_creationDate = { StructElement1, StructElement2, ..., StructElement n);

например

_creationDate = { 0, false, 44.2);

Или в вашем конструкторе просто вызовите каждый элемент в структуре и инициализируйте, например ...

_creationData.thing1 = 0;
_creationData.thing2 = false;
_creationData.thing3 = 66.3;
1 голос
/ 01 ноября 2010

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

struct tm a = {0}; // works ok
struct tm b;
b = {0};           // error

Один из вариантов - использовать значения по умолчанию

class a
{
    a() : t() {}
    struct tm t;
};

Или memset в конструкторе:

struct tm creationDate;
memset((void*)&creationDate, 0, sizeof(struct tm));
1 голос
/ 01 ноября 2010

http://www.cprogramming.com/tutorial/initialization-lists-c++.html

class C {
    struct tm  _creationDate;
    struct tm  _expirationDate;
    struct tm  _lockDate;
    C() : _creationDate(), ... {}
0 голосов
/ 01 ноября 2010

В C ++ возможен только путь 03:

class foo
{
    tm _creationDate;
    public:
    foo()
    {
        tm tmp_tm = {0};
        _creationDate = tmp_tm;
    }
};

Обратите внимание, что это инициализирует _creationDate с копией tmp_tm, вызывая (скорее всего, автоматически сгенерированный) конструктор копирования.Так что для больших структур вам лучше придерживаться своей служебной функции, так как для этого не потребуется копировать всю структуру.

И, кстати, не следует использовать имя, начинающееся с подчеркивания, поскольку они зарезервированы для реализациистандартная библиотека (для внутреннего использования), так что это может привести к конфликтам имен или другому нежелательному поведению.

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