Я бы рекомендовал использовать std::vector
вместо динамически размещаемого массива.С std::vector
гораздо проще работать, и она не пропускает память.
Однако отсутствующий конструктор, на который ссылается сообщение об ошибке, это конструктор Square
.Вам нужно добавить конструктор для Square
, который не принимает аргументов. ONE из следующего будет делать:
class Square {
Square() { ... }
// Square with dimensions of 0 is empty
Square(int length=0, int width=0) { ... }
...
};
Обратите внимание, что если вы поместите оба этих файла в файл, вы получите ошибку, потому что это будет невозможнознать, какой конструктор вызывать, если не задано никаких аргументов .
Возможно, вам понадобится конструктор по умолчанию, даже если вы используете std::vector
.«Вероятно», потому что вы можете обойти это, если вы ограничите себя конструкторами std::vector
, которые берут объект, например ::
std::vector<Square> foo(10, Square(0, 0));
// reassign each element accordingly
Я уже добавил это каккомментарий к самому вопросу.Как говорит Херб Саттер, std::vector
предназначен для взаимозаменяемости с массивами :
Почему так важно, чтобы векторы были смежными?Потому что это то, что вам нужно, чтобы гарантировать, что вектор совместим с макетом с массивом C, и поэтому у нас нет оснований не использовать вектор в качестве превосходной и безопасной для типов альтернативы массивам, даже когда нам нужно обмениваться данными с кодом C.Таким образом, вектор является нашим входом в другие языки и большинство функций операционных систем, языком которых является почтенный массив C.
Синтаксис, кстати, таков (если v
- вектор) &v[0]
.То есть, взять адрес первого элемента (и это ссылка, так что он работает на всех std::vector
с, кроме std::vector<bool>
), и вы получите указатель, который вы можете передать любой функции, которая ожидает указатель (Вы можете, конечно, получить длину «массива» как v.size()
).