Инициализация стоимости в struct - C ++

эта вещь во мне создал struct:

struct salari{
unsigned int base;
unsigned int dietes;
unsigned int total=base+dietes;
};

и после сделав main:

int main(){
salari a;
a.base=100;
a.dietes=2;
cout<<a.base<<endl;
cout<<a.dietes<<endl;
cout << a.total << endl;
}

составив это так

g++ base_dades.cc -o base_dades.e

у меня выходит этот warning

warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
unsigned int total=base+dietes;

где выполнив output, он:

100
2
4196768

кто-то знает причину это перемещает

1
задан 07.01.2017, 15:36
0 ответов

Ошибка, которую ты представляешь нам, проистекает из следующего:

unsigned int total=base+dietes;

Ты стараешься инициализировать полную стоимость состоя в том, чтобы он основал, и dietes у них нет назначенной стоимости, так что составитель показывает тебе это предупреждение, так как в отличие от классов назначенные по умолчанию структуры не могут инициализироваться в заявлении, НО Существует решение.

Voila Решение:

struct salari{
  unsigned int base;
  unsigned int dietes;
  unsigned int total;

  salari(){
   base = 0;
   dietes = 0;
   total = base + dietes;
  }
};

Это способ делать вид constructor для структур в C ++, с этой ты можешь инициализировать каждую из стоимости, содержавшей в структуре, без того, чтобы тебя не бросала никакая ошибка.

После этого вывод:

100
2
0

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

0
ответ дан 03.12.2019, 17:50
  • 1
    Нет. Предупреждение - это из-за того, что использует caracterí stica C ++ 11 так, что у 11 включенных нет flags C ++. –  09.01.2017, 09:34

В C ++, в отличие от того как C# и Java, не был позволен инициализировать переменные член в месте заявления. Такой он пошел до тех пор, пока в августе 2011 не был принят стандарт C ++ 11 добавляя эту функциональность к стандартному поведению языка.

[Здесь] у тебя есть описание этой функциональности на странице Бьярне Страустрапа (На английском), получи техническое имя Инициализации членов в классе ("In-class member initializers").

Составитель gcc.

Инициализация членов в классе вынесен в gcc с версии 4.71. Чтобы давать использование характеристикам C ++ 11 должен включать способ C ++ 11 из составителя добавляя параметр -std=c++11 в команду компиляции, как он показывает тебе тревогу, которую ты получаешь, составив:

warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11
unsigned int total=base+dietes;

Так что ты был бы должен прекращать иметь эту тревогу, если ты составляешь таким образом:

g++ base_dades.cc -o base_dades.e -std=c++11

Конечно у тебя есть версия gcc, равного или превышающего 4.7, из-за которого код составляет несмотря на то, чтобы быть ошибочным кодом в стандартах C ++ предварительные в C ++ 11. Как параметр компиляции -std=c++11 он не добавляется по умолчанию, показывает тебе тревогу (вместо ошибки) из-за того, что является способен составлять код несмотря на отсутствие выбора подходящей компиляции.

Функционирование Инициализации членов в классе.

У меня есть чувство (исправь меня, если я ошибаюсь) то, что ты надеялся, что вывод твоего кода:

100
2
102

Но это не произошло бы так, так как инструкция unsigned int total=base+dietes; он работает во время строительства инстанции salariа именно: в том же моменте, в котором инструкция salari a; она выполнена.

Ввиду того, что члены base и dietes у них нет начальной стоимости, Ваша стоимость - indeterminado2, но не редко - различная стоимость 0. Так что стоимость 4196768 который ты получил, является результатом складывания двух типов стоимости памяти случайным образом во время строения a.

Для того, чтобы total станьте отвечающим совремнным требованиям автоматически, распределив base и dietes ты был бы должен использовать функции ассигнования:

struct salari{
unsigned int base = 0;
unsigned int dietes = 0;
unsigned int total = 0;

void assigna_base(unsigned int valor){
base = valor;
total = base + dietes;
}

void assigna_dietes(unsigned int valor){
dietes = valor;
total = base + dietes;
}
};

Так, ты main с этими функциями:

int main(){
salari a;
a.assigna_base(100);
a.assigna_dietes(2);

std::cout << a.base   << '\n'
          << a.dietes << '\n'
          << a.total  << '\n';

return 0;
}

Он дал бы этот вывод

100
2
102

Обрати внимание, что я инициализировал в 0 все члены salari с Инициализацией членов в классе.

Molta sort Pol, fins altra :)


1 [Здесь] тебе может казаться характеристики добавленными в C ++ и к, какую версию gcc они были осуществлены.

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

1
ответ дан 03.12.2019, 17:50