C ++ многоугольник и наследование треугольника

0

Я пытаюсь создать класс 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++...

  • 0
    Добавьте конструктор по умолчанию в класс Polygon.
  • 0
    Действительно, многие из моих проблем были решены, но все равно я получаю последнюю ошибку 38
Теги:
inheritance

3 ответа

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

Вы не должны вызывать конструктор для использования . , такие как:

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();
};
  • 0
    ит я получаю: 37 нет соответствующей функции для вызова `Rectangle :: Rectangle (int, int) '
  • 0
    @ user3265784 извините, я не компилирую раньше, вы должны добавить конструкторы для каждого подкласса. я обновляю коды.
0

Вы должны использовать этот путь... Rectangle *s1 = new Rectangle; s1->ab(5,2); s1->calc_area();

0

Чтобы построить 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);

Ещё вопросы

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