Создание массива структуры

0

Я пытаюсь создать массив структур, но я получаю ошибку, 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?

  • 3
    использовать std :: vector
  • 1
    Где по умолчанию конструктор в Cell? У тебя его нет.
Теги:
class
arrays

3 ответа

4
Лучший ответ

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];

Не забывайте уничтожать его.

  • 0
    Современный C ++ предпочитает ячейки std :: shared_ptr <Cell> (новая ячейка [сумма]), потому что тогда вы не можете забыть ее уничтожить.
  • 0
    Оно работает! У меня есть побочный вопрос: есть ли разница между тем, как мы писали наши конструкторы? Вы пишете Name(argument): number(n) {} , а я пишу Name(argument): number(n) {} Name(argument) { number(n) }
Показать ещё 9 комментариев
2

Если вы знаете, как долго массив, вы можете использовать инициализацию 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 ) );
    }
}
  • 0
    Зачем здесь emplace_back , который поддерживается только C ++ 11, когда push_back будет генерировать точно такой же код?
  • 0
    @JamesKanze Понятия не имею. Как вы сказали, push_back отлично работает :)
0

Выполняя Cell cells [amount]; вы вызываете конструктор Cell, но в этом случае у вас нет конструктора по умолчанию для Cell, поэтому вместо этого вы должны использовать указатели, вы используете их в то while материал.

Просто измените

Cell cells [amount];

для

Cell* cells [amount];
  • 1
    @JohnDibling, у него есть конструктор, но не конструктор по умолчанию ... вот почему он падает.
  • 1
    @JohnDibling У него есть конструктор, но не конструктор по умолчанию .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню