Форум программистов, компьютерный форум CyberForum.ru

Где ошибка? - C++

Восстановить пароль Регистрация
 
spaun13
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 13
11.03.2013, 16:57     Где ошибка? #1
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
#include <iostream>
 
 
class Shape
{
public:
    Shape(double a = 0, double b = 0)
    {
        x = a;
        y = b;
    }
    virtual double getArea() = 0;
    double x;
    double y;
    double area;
};
 
class Triangle : public Shape
{
public:
    Triangle(double xx = 0,double yy = 0):Shape(x, y)
    {
 
    }
    double getArea()
    {
        area = 0.5*x*y;
        std::cout << "Area of triangle = " << std::endl; return area;
    }
};
 
class Rectangle : public Shape
{
public:
    Rectangle(double xx = 0, double yy = 0):Shape(x, y)
    {
 
    }
    double getArea()
    {
        area = x*y;
        std::cout << "Area of rectangle = " << std::endl; return area;
    }
};
 
class Square : public Shape
{
public:
    Square(double xx = 0, double yy = 0):Shape(x, y)
    {
 
    }
    double getArea()
    {
        area = x*y;
        std::cout << "Area of square = " << std::endl; return area;
    }
};
 
int main()
{
    Triangle n(2.0, 7.0);
    Rectangle m(9.0, 4.0);
    Square l(7.0, 8.0);
 
    Shape *first = &n;
    Shape *second = &m;
    Shape *third = &l;
 
    first->getArea();
    second->getArea();
    third->getArea();
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 16:57     Где ошибка?
Посмотрите здесь:

C++ Где ошибка??
Где ошибка? C++
C++ Где ошибка?
Где ошибка? C++
C++ Вывести на экран количество слов где первая и последняя буквы одинаковы (не понимаю где ошибка)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
srg_btl
33 / 33 / 2
Регистрация: 21.02.2013
Сообщений: 90
11.03.2013, 17:07     Где ошибка? #2
Во первых если класс будет наследоваться поставь себе за привычку создавать виртуальный деструктор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
{
public:
    Shape(double a = 0, double b = 0)
    {
        x = a;
        y = b;
    }
    virtual ~Shape() {}
    virtual double getArea() = 0;
    double x;
    double y;
    double area;
};
Во вторых он у тебя ничего не выводит из-за того что ты не указал что нужно выводить.
std::cout << "Area of triangle = " << area << std::endl; return area;

и то что ты возвращаешь из функции значение означает что ты можешь получить значение из вне, поместив это значение в переменную. Например:
C++
1
2
3
4
5
6
7
double area;
area = first->getArea();
std::cout << area;
area = second->getArea();
std::cout << area;
area = third->getArea();
std::cout << area;
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 17:12     Где ошибка? #3
Цитата Сообщение от spaun13 Посмотреть сообщение
Triangle(double xx = 0,double yy = 0):Shape(x, y)
а x и у откуда берутся если Вы создаете
Цитата Сообщение от spaun13 Посмотреть сообщение
C++
1
Triangle n(2.0, 7.0);
будет неизвестое значение
srg_btl
33 / 33 / 2
Регистрация: 21.02.2013
Сообщений: 90
11.03.2013, 17:33     Где ошибка? #4
C++
1
Triangle(double xx = 0,double yy = 0):Shape(x, y)
Твой конструктор принимает 2 переменные double: xx и yy, и ты пытаешся передать в конструктор родительского класса переменные x и y. Если не ошибаюсь для них сработает конструктор по-умолчанию и они будут равны 0, либо какойто мусор, который хранился до этого в этом участке памяти. Надо передавать значения так:
C++
1
Triangle(double xx = 0,double yy = 0):Shape(xx, yy)
Добавлено через 5 минут
Конструктор это всего лишь функция(метод) который выполняеться после алокации памяти, чтоб выполнить инициализацию переменых или других обьектов. Так как триангл и другие классы наследуються от Шейпа, то это значит что у них есть свойства и переменые базового класса, т.е. есть переменные x и y, но они только поместились в памяти не инициализированы, и ты этот муссор передаешь родительському классу. Из-за этого и не понятки получаються

Добавлено через 5 минут
Так же именно после двух точек ты вызываешь конструкторы для элементов класса, если же ты там ничего не написал сработает конструктор по-умолчанию. В твоем случае
C++
1
2
3
4
5
    Shape(double a = 0, double b = 0)
    {
        x = a;
        y = b;
    }
Сначала для х и у сработал конструктор по-умолчанию, где их значения стали нулями, а после этого в теле функций ты вызываешь оператор присваивания, где уже помещаешь нужные тебе значения. Эфективнее делать так:
C++
1
2
3
4
    Shape(double a = 0, double b = 0): x(a), y(b)
    {
  
    }
В этом случае ты сразу вызываешь для них конструктор с нужными параметрами. И не забывай про порядок, вызывай конструкторе в таком же порядке ккак и обьявлены элементы в классе. если х первый стоит то сначала для него вызываешь, или наоборот с у.
spaun13
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 13
11.03.2013, 17:33  [ТС]     Где ошибка? #5
Спасиб Щас пишет последняя фигурная скобка ее нету.......
srg_btl
33 / 33 / 2
Регистрация: 21.02.2013
Сообщений: 90
11.03.2013, 17:56     Где ошибка? #6
Рабочий код. На мой взгляд самый оптимальный вариант
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
#include <iostream>
 
 
class Shape
{
public:
    Shape(double a = 0, double b = 0) 
    : x(a)
    , y(b)
    {}
    virtual ~Shape() {}
    virtual double getArea() = 0;
    double x;
    double y;
};
 
class Triangle : public Shape
{
public:
    Triangle(double xx = 0,double yy = 0)
    : Shape(xx, yy)
    {
 
    }
    double getArea()
    {
        return 0.5*x*y;
    }
};
 
class Rectangle : public Shape
{
public:
    Rectangle(double xx = 0, double yy = 0)
    : Shape(xx, yy)
    {
 
    }
    double getArea()
    {
        return x*y;
    }
};
 
class Square : public Shape
{
public:
    Square(double xx = 0, double yy = 0)
    : Shape(xx, yy)
    {
 
    }
    double getArea()
    {
        return x*y;
    }
};
 
int main()
{
    Triangle n(2.0, 7.0);
    Rectangle m(9.0, 4.0);
    Square l(7.0, 8.0);
 
    Shape *first = &n;
    Shape *second = &m;
    Shape *third = &l;
 
    double trArea, reArea, sqArea;
    trArea = first->getArea();
    reArea = second->getArea();
    sqArea = third->getArea();
 
    std::cout << "Area of triangle = " << trArea << std::endl;    
    std::cout << "Area of rectangle = " << reArea << std::endl;    
    std::cout << "Area of sqArea = " << sqArea << std::endl;    
 
    system("pause");
    return 0;
}
Добавлено через 7 минут
Или так:

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
#include <iostream>
 
 
class Shape
{
public:
    Shape(double a = 0, double b = 0) 
    : x(a)
    , y(b)
    {}
    virtual ~Shape() {}
    double getArea() { return area; }
    virtual void showArea() = 0;
    double x;
    double y;
    double area;
};
 
class Triangle : public Shape
{
public:
    Triangle(double xx = 0,double yy = 0)
    : Shape(xx, yy)
    {
       area = 0.5*x*y;
    }
    void showArea()
    {
       std::cout << "Triangle area = " << area << std::endl;
    }
};
 
class Rectangle : public Shape
{
public:
    Rectangle(double xx = 0, double yy = 0)
    : Shape(xx, yy)
    {
       area = x*y;
    }
    void showArea()
    {
       std::cout << "Rectangle area = " << area << std::endl;
    }
 
};
 
class Square : public Shape
{
public:
    Square(double xx = 0, double yy = 0)
    : Shape(xx, yy)
    {
       area = x*y;
    }
    void showArea()
    {
       std::cout << "Square area = " << area << std::endl;
    }
};
 
int main()
{
    Triangle n(2.0, 7.0);
    Rectangle m(9.0, 4.0);
    Square l(7.0, 8.0);
 
    Shape *first = &n;
    Shape *second = &m;
    Shape *third = &l;
 
    double trArea, reArea, sqArea;
    trArea = first->getArea();
    reArea = second->getArea();
    sqArea = third->getArea();
 
    std::cout << "Area of triangle = " << trArea << std::endl;    
    std::cout << "Area of rectangle = " << reArea << std::endl;    
    std::cout << "Area of sqArea = " << sqArea << std::endl; 
 
    first->showArea();   
    second->showArea();   
    third->showArea();   
 
    system("pause");
    return 0;
}
Нет смысла каждый раз вычислять значения,
C++
1
2
3
4
5
    double getArea()
    {
        area = 0.5*x*y;
        std::cout << "Area of triangle = " << std::endl; return area;
    }
если они у тебя не меняються, лучше сразу в конструкторе вычислить а потом просто возвращать значения
spaun13
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 13
11.03.2013, 18:09  [ТС]     Где ошибка? #7
Да все норм!)
xSCJx
22 / 19 / 1
Регистрация: 24.12.2012
Сообщений: 435
11.03.2013, 18:19     Где ошибка? #8
Почему метод showArea(), в производных классах не виртуальный?
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 18:33     Где ошибка? #9
Цитата Сообщение от SERUYBKR Посмотреть сообщение
Почему метод showArea(), в производных классах не виртуальный?
а кто тебе сказал что он не виртуальный?)
srg_btl
33 / 33 / 2
Регистрация: 21.02.2013
Сообщений: 90
11.03.2013, 18:37     Где ошибка? #10
Если базовый класс имеет виртуальный метод, то этот метод в производных классах также виртуальный, и нет смысла писать виртуал, хотя для удобства можно и написать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 18:39     Где ошибка?
Еще ссылки по теме:

C++ Где ошибка?
Где ошибка? C++
Где ошибка? C++

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

Или воспользуйтесь поиском по форуму:
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 18:39     Где ошибка? #11
Цитата Сообщение от srg_btl Посмотреть сообщение
и нет смысла писать виртуал, хотя для удобства можно и написать.
есть определенный смысл, как советует Майерс - лучше писать всегда, чтобы потом наследуясь от производного класса не забыть что этот метод виртуальный
Yandex
Объявления
11.03.2013, 18:39     Где ошибка?
Ответ Создать тему
Опции темы

Текущее время: 04:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru