Я пытаюсь создать класс Polygon и Rectangle и Triangle, которые наследуют первый. Класс Polygon имеет переменные высоты и ширины, которые я хочу, чтобы им присваивались значения внутри конструктора. Затем Rectangle и Triangle имеют методы расчета площади. Затем я использую main(), чтобы привести некоторые примеры. Я использую:
#include <iostream>
using namespace std;
class Polygon {
public:
Polygon(int, int);
protected:
int height;
int width;
};
class Rectangle: public Polygon {
public:
void calc_area();
};
class Triangle: public Polygon {
public:
void calc_area();
};
Polygon::Polygon(int a, int b) {
height = a;
width = b;
}
void Rectangle::calc_area() {
cout << "Rectangle area: " << (height*width) << endl;
}
void Triangle::calc_area() {
cout << "Triangle area: " << (height*width/2) << endl;
}
int main() {
Rectangle s1(5, 2);
Triangle s2(5, 2);
s1.calc_area();
s2.calc_area();
}
Но пока все выглядит нормально для моих новичков, я получаю ряд ошибок:
12 base Polygon 'с конструктором, не являющимся стандартным, в классе без конструктора'
36 нет соответствующей функции для вызова "Прямоугольник :: Rectangle (int, int)
37 нет подходящей функции для вызова в 'Triangle :: Triangle (int, int)'
Может кто-нибудь дать мне несколько советов? Как видно, я очень новичок в C++...
Вы не должны вызывать конструктор для использования .
, такие как:
Rectangle s1;
Triangle s2;
s1.Polygon(5, 2);
s2.Polygon(5, 2);
попробуйте вот так:
Rectangle s1(5, 2);
Triangle s2(5, 2);
и вы должны добавить конструктор для Rectangle
и Triangle
соответственно:
class Rectangle: public Polygon {
public:
Rectangle(int height, int width):Polygon(height, width){}
void calc_area();
};
class Triangle: public Polygon {
public:
Triangle(int height, int width):Polygon(height, width){}
void calc_area();
};
Вы должны использовать этот путь... Rectangle *s1 = new Rectangle;
s1->ab(5,2);
s1->calc_area();
Чтобы построить Triangle
и Rectangle
вы вызываете их невидимые конструкторы по умолчанию.
Таким образом, методы Triangle()
и Rectangle()
. Они реализованы как пустые методы, но они также должны вызывать конструкторы по умолчанию любого класса, на который они наследуют. Так эффективно это генерируемый код:
Triangle() : Polygon() {}
Rectangle() : Polygon() {}
Polygon
не получит конструктор по умолчанию, потому что вы создали свой собственный конструктор. Таким образом, единственный способ получить это - определить его:
Polygon() {}
Или в С++ 11:
Polygon() = default;
Конструктор по умолчанию Triangle()
или Rectangle()
вызывается при создании экземпляра переменной-члена. Таким образом, эти строки вызывают конструкторы:
Rectangle s1;
Triangle s2;
Обратите внимание, что после их построения они не могут быть восстановлены. Таким образом, эти призывы являются незаконными:
s1.Polygon(5, 2);
s2.Polygon(5, 2);
Теперь, если вы хотите выполнить конструктор настроек, вы можете это сделать, но вам нужно определить его для Triangle
и Rectangle
:
Triangle(int width, int height) : Polygon(width, height) {}
Triangle(int width, int height) : Polygon(width, height) {}
Опять вспомним, что определение этих методов приведет к тому, что конструктор по умолчанию не будет создан для Triangle
или Rectangle
. Таким образом, ваши объявления s1
и s2
будут теперь незаконными, но это нормально, потому что вы хотите объявить их со своими новыми конструкторами:
Rectangle s1(5, 2);
Triangle s2(5, 2);