Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Где здесь ошибка?

#cpp


Пожалуйста помогите найти мою ошибку.

Почему компилятор ругается?

struct memb{
    int nomer;
    string score;
 memb(int nomer = 0, string score) : nomer(nomer), score(score) {};


 }*cis;



  24|error: default argument missing for parameter 2 of ‘memb::memb(int,
  std::__cxx11::string)’|

    


Ответы

Ответ 1



Параметр(ы) со значением по умолчанию должен(ы) быть последним(и). У вас же после параметра со значением по умолчанию идет обычный параметр. Если так хочется - сделайте memb(string score, int nomer = 0) : nomer(nomer), score(score) {};

Ответ 2



Данное объявление struct memb{ int nomer; string score; memb(int nomer = 0, string score) : nomer(nomer), score(score) {}; }*cis; Имело бы смысл, если бы в C++ был разрешен такой вызов функций, как memb( , "Hello" ); ^^^ Однако такой вызов в C++ является синтаксической ошибкой. То есть вы не можете пропускать выражения аргументов при вызове функции. Можно пропускать значения выражений аргументов функций только в конце списка аргументов при условии, что пропущенным аргументам соответствуют аргументы по умолчанию. Вы могли бы определить конструкторы данной структуры следующим образом Данное объявление struct memb{ int nomer; string score; memb( const string &score) : nomer(0), score(score) {}; memb(int nomer, const string &score) : nomer(nomer), score(score) {}; }*cis; Либо вы могли бы использовать делегирующий конструктор. Например, struct memb{ int nomer; string score; memb( const string &score) : memb( 0, score ) {}; memb(int nomer, const string &score) : nomer(nomer), score(score) {}; }*cis; Обратите внимание, что параметр, который соответствует объекту типа std::string лучше объявить как константную ссылку на объект. В этому случае вы можете также в качестве аргумента использовать строковые литералы. Например, memb( "Hello World!" ); Выражение со строковым литералом неявно преобразуется во временный объект типа std::string и константная ссылка на этот объект будет передана конструктору. Также, возможно вам понадобится конструктор по умолчанию, если вы собираетесь создавать массивы элементов данной структуры. Например, struct memb{ int nomer; string score; memb() : nomer(0) {}; memb( const string &score) : nomer(0), score(score) {}; memb(int nomer, const string &score) : nomer(nomer), score(score) {}; }*cis; Если создаваемый массив небольшой, то вы можете инициализировать каждый элемент массива при вызове оператора new. Например, #include #include struct memb { int nomer; std::string score; memb() : nomer(0) {} memb( const std::string &score) : nomer(0), score(score) {} memb( int nomer, const std::string &score ) : nomer(nomer), score(score) {} } *cis = new memb[2] { { 1, "A" }, { 2, "B" } }; int main() { return 0; } Иначе вам придется создавать элементы массива, используя конструктор по умолчанию, а затем присваивать требуемые значения членам данных каждого элемента массива. Вы упростите себе жизнь, если вместо вручную выделять массив будете ипользлвать стандартный класс std::vector.

Комментариев нет:

Отправить комментарий