Как инициализировать по умолчанию локальные переменные встроенных типов в C ++? - PullRequest
3 голосов
/ 06 апреля 2010

Как инициализировать по умолчанию локальную переменную примитивного типа в C ++?Например, если есть typedef:

typedef unsigned char boolean;//that's Microsoft RPC runtime typedef

Я бы хотел изменить следующую строку:

boolean variable = 0; //initialize to some value to ensure reproduceable behavior
retrieveValue( &variable ); // do actual job

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

struct Struct {
   int Value;
   Struct() : Value() {}
};

и Struct::Value будет инициализироваться по умолчанию к одному и тому же значению каждый раз, когда создается экземпляр, но я никогда не записываю фактическое значение в коде.

Как я могу получить такое же поведение для локальных переменных

Ответы [ 5 ]

5 голосов
/ 06 апреля 2010

Вы можете эмулировать такое поведение следующим образом:

boolean x = boolean();

или, в более общем смысле,

T x = T();

Это инициализирует по умолчанию x, если такая инициализация по умолчанию существует. Тем не менее, простое написание T x никогда не даст результата для локальных переменных, независимо от того, что вы делаете.

Вы также можете использовать place-new для вызова «конструктора», даже для POD:

T x;
new (&x) T();

Обратите внимание, что этот код создает неопределенное поведение для не POD-типов (в частности, для типов, имеющих нетривиальный деструктор). Чтобы этот код работал с пользовательскими типами, сначала нужно вызвать деструктор объекта:

T x;
x.~T();
new (&x) T();

Этот синтаксис может также использоваться для POD (гарантируется §§5.2.4 / 12.4.15), поэтому приведенный выше код может использоваться без разбора для любого типа.

4 голосов
/ 06 апреля 2010
    int var = int();
    string str = string();
    ...

... или любое другое имя, которое вы хотите.

1 голос
/ 06 апреля 2010

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

#include <cassert>

template <class T>
class Type
{
    T t;
public:
    Type(const T& t = T()): t(t) {}
    operator T&() { return t; }
    operator const T&() const { return t; }
};

int main()
{
    Type<unsigned char> some_value;
    assert(some_value == '\0');
}

Это должно быть вполне приемлемым для операторов преобразования.

0 голосов
/ 06 апреля 2010

Если я понимаю исходный вопрос, автор говорит, что он хочет, чтобы переменные данного типа всегда имели одинаковое начальное значение, но ему все равно, что это за значение, потому что он никогда не будет смотреть на него. Я прав?

Если это так, то мой вопрос к постеру таков: если бы вы не инициализировали переменные, у них были бы случайные начальные значения ... но вы сказали, что никогда не смотрите на начальные значения - так почему это важно, если они случайный?

Я думаю, что ключевой вопрос - чего вы пытаетесь достичь здесь?

0 голосов
/ 06 апреля 2010

Свертывание в struct (Boolean), как в вашем примере, и доступ через открытый член (Boolean :: value).Возможно, это не самое изящное решение (немного бесполезное), но оно похоже на то, что вы уже показали.

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