Пожалуйста помогите найти мою ошибку.
Почему компилятор ругается?
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)’|
Параметр(ы) со значением по умолчанию должен(ы) быть последним(и). У вас же после параметра со значением по умолчанию идет обычный параметр.
Если так хочется - сделайте
memb(string score, int nomer = 0) : nomer(nomer), score(score) {};
Данное объявление
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 <iostream>
#include <string>
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<memb>.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники