как исправить "неопределенную ссылку на Shape :: Shape () '- ошибка сборки 3 (ий) в C ++" - PullRequest
0 голосов
/ 06 февраля 2019

Я изучаю C ++ OO Design, и я столкнулся со следующей проблемой, где я должен использовать абстрактные классы и наследование.

Я работаю над проблемой, где я должен использовать абстрактный класс, называемый Shape, которая должна содержать виртуальную функцию с именем get_area(), которая возвращает double.

  • Класс Circle наследует класс Shape и содержит функции конструктора и члена:

    • Circle(double radius)
    • double get_radius()
    • void set_radius(double radius)
    • double get_area()
  • Класс Square наследует класс Shape и содержит:

    • Square(double width)
    • double get_width()
    • void set_width(double width)
    • double get_area()
  • Класс Rectangle наследует Square класс и содержит:

    • Rectangle(double width, double height)
    • double get_height()
    • void set_height(double width)
    • double get_area()

#include <iostream>
#include <string>
#include <cmath>

using namespace std;

class Shape {
    public:
        Shape();
        virtual double get_area() const = 0;
};

// Circle sub-class
class Circle : public Shape {
    private:
        double r;
    public:
        Circle(double radius) : Shape() {
            r = radius;
        }
        void set_radius(double radius) {
            r = radius;
        }
        double get_radius() {
            return r;
        }

        virtual double get_area() const {
            return 3.14159 * pow(r, 2);
        }
};

// Square sub-class
class Square : public Shape {
    protected:
        double w;
    public:
        Square(double width) : Shape() {
            w = width;
        }

        void set_width(double width) {
            w = width;
        }

        double get_width() const {
            return w;
        }

        virtual double get_area() const {
            return w * w;
        }
};

/*
// Rectangle sub-class
class Rectangle : public Shape, public Square {
    private:
        double h, w;
    public:
        Rectangle(double width, double height) : Shape(){
            h = height;
            w = width;
        }

        void set_heigth(double height) {
            h = height;
        }

        void set_width(double width) {
            w = width;
        }

        double get_height() const {
            return h;
        }

        double get_width() const {
            return w;
        }

        virtual double get_area() const {
            return h * w;
        }
};

*/

// -------------------------------------------------------------------
int main() {
    Circle c(5.5);
    cout << "\t" << c.get_radius() << endl;

    //Rectangle r(4.2, 2.5);
    //cout << "\t" << r.get_width() << " " << r.get_height() << endl;

    return 0;
}

Что на самом деле делает:

неопределенная ссылка на 'Shape :: Shape ()

Класс Rectangle также выдает ошибкуВот почему он комментируется

Что нужно сделать: я должен иметь возможность создать объект из любого из этих классов с именем Circle c и получить площадь, введя радиус.

1 Ответ

0 голосов
/ 06 февраля 2019

Это не связано с вашим наследованием, абстрактными классами или дизайном ОО.Проблема в том, что вы объявили Shape::Shape, то есть конструктор, но определения нет.Поэтому компоновщик жалуется, что он не может найти код для конструктора.

Попробуйте просто удалить конструктор Shape, он вам не нужен с первого взгляда.

...