повторно инициализировать членов структуры - PullRequest
3 голосов
/ 01 марта 2012

Легко создать и инициализировать структуру ...

struct S{ int x; bool b; };

S s = {123,false};

Но возможно ли использовать тот же трюк на существующем объекте? Или это единовременная вещь?

   S s = {123,false};
   s = {456,true}; //fails
   s = S(){456,true}; //fails

Есть ли синтаксическая хитрость ... очевидно, я мог бы сделать:

   S s = {123,false};
   S temp={456,true};
   s = temp;

Но можно ли удалить явное объявление переменной temp?

Я должен добавить, что я работаю над VC ++ 2008, так что никакие модные современные C ++ материалы не доступны: (

Ответы [ 5 ]

3 голосов
/ 01 марта 2012

Нет. Инициализация происходит один раз. Инициализация происходит только тогда, когда вы создаете и одновременно присваиваете некоторые значения созданному объекту (т. Е. В одном операторе.

После создания объекта вы можете назначить ему только новые значения.

Короче говоря,
Вы не можете ничего инициализировать в C ++. Вы можете инициализировать объекты или назначать их.

Как только вы поймете этот факт, вы увидите, что существует множество возможных решений, таких как

  • передача элементов структуры в конструктор и создание объекта структуры
  • перегрузка оператора =, чтобы делать все, что вы хотите
2 голосов
/ 01 марта 2012

Вы можете добавить конструктор в свою структуру, а затем сделать что-то вроде:

struct S
{
    S(int x_in, bool b_in): x(x_in), b(b_in) { }
    int x;
    bool b;
}

S s(123, false);
s = S(456, true);
1 голос
/ 01 марта 2012

В C ++ 11 вы можете создать временный объект из списка инициализаторов и использовать его с оператором присваивания.Таким образом вы можете написать:

struct S {
    int x;
    bool b;
};

int main()
{
    S s = {42, true};
    s = {0, false};
}
1 голос
/ 01 марта 2012

В C ++ 11 вы можете:

s = S({456, true});
0 голосов
/ 01 марта 2012

Я не думаю, что struct будет поддерживать повторную инициализацию по умолчанию.

 S s = {123,false};
   S temp={456,true};
   s = temp; //calls the = operator

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

Или вы можете попробовать создать темп на лету.

 S s = {123,false};

   s = S (456,true); // this should work i suppose
...