Я пытаюсь создать массив структур, но я получаю ошибку, no matching function for call to 'Cell::Cell()'
.
Cell
- это имя моей структуры. Вот некоторые из моих кодов:
struct Cell{
int number;
Cell(int n){
number = n;
}
};
class MyClass{
public:
int nCells;
void inject(){
std::cout << "Enter number:";
string in;
std::cin >> in;
int amount = in.size()/3;
Cell cells [amount]; // <-- error
int index = 0;
int t = in.size();
while (t >= 3){
cells[index] = new Cell(atoi(in.substr(t-3,3).c_str());
t -= 3;
index++;
}
}
MyClass(int n){
nCells = n;
}
};
Cell cells [amount];
дает мне ошибку. Я новичок в классах, но знаю, как создавать массивы примитивных типов. int cells [amount];
будет работать, например.
Но как я могу создать массив типа Cell
?
Cell
нет конструктора по умолчанию (как только вы укажете другой конструктор, компилятор больше не будет создавать конструктор по умолчанию). Однако определение Cell cells[amount]
автоматически по умолчанию инициализирует каждый элемент.
Я думаю, что лучший способ в этой конкретной ситуации - просто реализовать конструктор по умолчанию:
struct Cell{
int number;
Cell() : number(0)
{
}
Cell(int n) : number(n)
{
}
};
Также обратите внимание, что во время компиляции amount
не известно, Cell cells[amount]
в основном незаконны. Однако некоторые компиляторы имеют расширения, позволяющие это делать. Но лучше, если вы куча выделяете его:
Cell* cells = new Cell[amount];
Не забывайте уничтожать его.
Name(argument): number(n) {}
, а я пишу Name(argument): number(n) {}
Name(argument) { number(n) }
Если вы знаете, как долго массив, вы можете использовать инициализацию c++ 11. Это будет делать:
int main()
{
Cell c[3]{ Cell(1), Cell(2), Cell(3) };
}
Кстати, это
Cell cells [amount];
использует VLA, и это не поддерживается c++ (только как расширение для некоторых компиляторов).
В c++ гораздо лучше было бы использовать std::vector
:
#include <vector>
struct Cell{
int number;
Cell(int n){
number = n;
}
};
int main()
{
int n = 5;
std::vector< Cell > c;
for ( int i =0; i < n; ++ i )
{
c.emplace_back( Cell( i ) );
}
}
emplace_back
, который поддерживается только C ++ 11, когда push_back
будет генерировать точно такой же код?
push_back
отлично работает :)
Выполняя Cell cells [amount];
вы вызываете конструктор Cell
, но в этом случае у вас нет конструктора по умолчанию для Cell
, поэтому вместо этого вы должны использовать указатели, вы используете их в то while
материал.
Просто измените
Cell cells [amount];
для
Cell* cells [amount];