Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 20.01.2017
Сообщений: 10
1

Почему компилятору не нравится объявление производного класса?

11.04.2018, 23:58. Показов 1067. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
не понимаю почему компилятору не нравится класс TwoDShape. Визуал Студио начинает ругаться на этапе объявления производного класса, а Саблайм в момент объявления базового.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
#include <iostream>
#include <cstring>
 
using namespace std;
 
class TwoDShape
{
    double width;
    double height;
    char name[20];
public:
    TwoDShape()
    {
        width = height = 0.0;
        strcpy(name, "неизвестный");
    }
    TwoDShape(double w, double h, char *n)
    {
        width = w; height = h;
        strcpy(name, n);
    }
    TwoDShape(double x, char *n)
    {
        width = height = x;
        strcpy(name, n);
    }
    void ShowDim()
    {
        cout << "ширина и высота равны " << width << " и " << height << '\n';
    }
    double GetWidth()
    {
        return width;
    }
    double GetHeight()
    {
        return height;
    }
    void setWidth(double w)
    {
        width = w;
    }
    void setHeight(double h)
    {
        height = h;
    }
    char *getName() { return name; }
    virtual double area()
    {
        cout << "\nОшибка. Функцию area() нужно переопределить.\n";
        return 0.0;
    };
 
    class Triangle : public TwoDShape
    {
        char style[20];
    public:
        Triangle() {
            strcpy(style, "неизвестный");
        }
        Triangle(double w, double h, char *str) : TwoDShape(w, h, "треугольник")
        {
            strcpy(style, str);
        }
        Triangle(double x) : TwoDShape(x, "треугольник") {
            strcpy(style, "равнобедренный");
        }
        double area() {
            return GetWidth() * GetHeight() / 2;
        }
        void showStyle() {
            cout << "этот треугольник " << style << "\n";
 
        }
    };
    class Rectangle : public TwoDShape
    {
    public:
        Rectangle(double w, double h) : TwoDShape(w, h, "прямоугольник") {}
        Rectangle(double x) : TwoDShape(x, "прямоугольник") {}
        bool isSquare() {
            if (getWidth() == getHeight()) return true;
            return false;
        }
        double area() {
            return GetWidth() * GetHeight();
        }
    };
 
};
 
 
 
int main()
{
    TwoDShape *shapes[5];
    shapes[0] = Triangle("прямоугольный", 8.0, 12.0);
    shapes[1] = Rectangle(10);
    shapes[2] = Rectangle(10, 4);
    shapes[3] = Triangle(7.0);
    shapes[4] = TwoDShape(10, 20, "общий");
    for (int i = 0; i < 5; i++) {
        cout << "Этот объект " << shapes[i]->getName() << "\n";
        cout << "Площадь равна " << shapes[i]->area() << "\n\n";
    }
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2018, 23:58
Ответы с готовыми решениями:

Подскажите, пожалуйста, почему компилятору не нравится '.' в конце программы?
const NA=20; Type Mas=array of word; var g :Mas; i,n :word; procedure Gray(k :word);

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его...

Что не нравится компилятору в &=
object t = temp.CurrentRow.Cells.Tag; (int)t &amp;= 2; получаю Ошибка 7 Левая часть выражения...

Что-то компилятору не нравится. Ввод-вывод
Да-да КОКОКО, БЫДЛОКОД, МАМКУ... Я его испоганил до ужаса, а компиль всё равно не хочет...

5
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
12.04.2018, 00:46 2
climb99, скобка закрытия класса TwoDShape должна быть не перед int main() а между строками

C++
1
2
3
4
5
6
7
    virtual double area()
    {
        cout << "\nОшибка. Функцию area() нужно переопределить.\n";
        return 0.0;
    };
 };    // - здесь должен заканчиваться этот класс
    class Triangle : public TwoDShape
1
0 / 0 / 0
Регистрация: 20.01.2017
Сообщений: 10
12.04.2018, 02:47  [ТС] 3
все равно не работает.., Амперсанты в инициализацию массива объектов подставил. В остальном не понимаю чего хочет.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
12.04.2018, 03:41 4
Лучший ответ Сообщение было отмечено climb99 как решение

Решение

1) константные строки предаются по указателю на константу
C++
1
2
3
4
5
6
7
8
9
10
    TwoDShape(double w, double h, const char *n)
    {
        width = w; height = h;
        strcpy(name, n);
    }
    TwoDShape(double x, const char *n)
    {
        width = height = x;
        strcpy(name, n);
    }
аналогично в Triangle
2) тут был перепутан регистр первой буквы функций
C++
1
2
3
4
        bool isSquare() {
            if (GetWidth() == GetHeight()) return true;
            return false;
        }
3) если создаёшь объекты динамически, то где new ?
C++
1
2
3
4
5
    shapes[0] = new Triangle(8.0, 12.0, "прямоугольный");
    shapes[1] = new Rectangle(10);
    shapes[2] = new Rectangle(10, 4);
    shapes[3] = new Triangle(7.0);
    shapes[4] = new TwoDShape(10, 20, "общий");
4) пиши виртуальные деструкторы, без них у тебя не удастся очистить память от этих динамически выделенных объектов
(при delete shapes[i] будет вызван только ~TwoDShape(), а не например ~Rectangle() )
1
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
12.04.2018, 03:41 5
Лучший ответ Сообщение было отмечено climb99 как решение

Решение

1) константные строки предаются по указателю на константу
C++
1
2
3
4
5
6
7
8
9
10
    TwoDShape(double w, double h, const char *n)
    {
        width = w; height = h;
        strcpy(name, n);
    }
    TwoDShape(double x, const char *n)
    {
        width = height = x;
        strcpy(name, n);
    }
аналогично в Triangle
2) тут был перепутан регистр первой буквы функций
C++
1
2
3
4
        bool isSquare() {
            if (GetWidth() == GetHeight()) return true;
            return false;
        }
3) если создаёшь объекты динамически, то где new ?
C++
1
2
3
4
5
    shapes[0] = new Triangle(8.0, 12.0, "прямоугольный");
    shapes[1] = new Rectangle(10);
    shapes[2] = new Rectangle(10, 4);
    shapes[3] = new Triangle(7.0);
    shapes[4] = new TwoDShape(10, 20, "общий");
4) пиши виртуальные деструкторы, без них у тебя не удастся очистить память от этих динамически выделенных объектов
(при delete shapes[i] будет вызван только ~TwoDShape(), а не например ~Rectangle() )
1
0 / 0 / 0
Регистрация: 20.01.2017
Сообщений: 10
12.04.2018, 05:18  [ТС] 6
огромное спасибо
0
12.04.2018, 05:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.04.2018, 05:18
Помогаю со студенческими работами здесь

QString arg - что не нравится компилятору?
QString response = &quot;HTTP/1.1 200 OK\r\n\r\nCurrent time: %1&quot;;...

Наследование: почему вызывается метод базового класса, а не производного?
Всем привет, такой вопрос, почему вызывается в данном коде метод базового класса, а не производного...

Почему выносят объявление класса в отдельный файл
почему не правильно выносить классы Х файл, и рекомендуют в хереде объявления а в спп описание*...

Порядок записи полей базового и производного классов, почему сначала производного а потом базового, ведь должно быть наоборот ?
Есть простой пример. Получаю с помощью рефлексии поля двух классов, базового и производного. Почему...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru