Хорошо, новичок в C++, я довольно хорошо знаю Java и сейчас пытаюсь изучить C++. В любом случае, вот мой простой класс.
class PolyGon{
private:
PointArray aArray;
static int numberOfInst;
public:
PolyGon(Point point[], const int newSize) : aArray(point, newSize){}
};
Это нормально. И поправьте меня, если я ошибаюсь, но в списке инициализаторов aArray(point, newSize)
эквивалентно aArray = new PointArray(point, newSize)
.
Потому что, когда я пробую тот же самый код, но меняю последнюю строку на:
class PolyGon{
private:
PointArray aArray;
static int numberOfInst;
public:
PolyGon(Point point[], const int newSize){aArray = new PointArray(point, newSize)}
};
Это дает исключение:
нет совпадения для 'operator=' в '((PolyGon*)this)->PolyGon::aArray = (((PointArray*)operator new(8u)), (->PointArray::PointArray(((const Point*) точка), новыйРазмер), ))'|
Если вы хотите увидеть конструктор для PointArray, вот он:
PointArray::PointArray(const Point points[], const int newSize)
{
size = newSize;
x = new Point[size];
for(int i = 0; i < size; i++)
{
x[i] = points[i];
}
}
Хорошо, прежде чем я отправил это, я нашел ответ, в котором говорилось, что если у объекта нет конструктора по умолчанию, вы должны инициализировать его с помощью списков инициализаторов. У меня сейчас три вопроса:
- Почему это? Почему я не могу сделать это так, как хотел.
- Это правило применимо только к конструктору. Например, я могу сказать «PointArray aArray = new PointArray (point, newSize);» где-нибудь еще?
- У меня есть конструктор без аргументов. Так почему это дает мне эту ошибку?
Мой конструктор без аргументов выглядит так:
PointArray(){size = 0; x = new Point[0];}