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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
spaun13
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 13
#1

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

11.03.2013, 16:57. Просмотров 373. Ответов 10
Метки нет (Все метки)

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++
Компилятор ругается и очень больно #include &quot;stdafx.h&quot; #include&lt;stdio.h&gt; #include&lt;math.h&gt; int _tmain(int argc, _TCHAR* argv) ...

Где ошибка? - C++
Написать программу с применением функций. Дан массив размера N. Найти количество участков, на которых его элементы возрастают. #include...

Где ошибка? - C++
Где ошибка не могу найти? Вот задание(определит, сколько детей до 7 лет проживают на одной улице.) int main(int argc, char* argv) { ...

где ошибка - C++
#include &lt;iostream&gt; using namespace std; char *get_substr(char *sub, char *str); int main(){ char *substr; substr =...

Где ошибка? - C++
Программа должна считать массивы с клавиатуры и выполнять над ими действия, пока мы не поставим знак равенства. В результате должна вывести...

Где ошибка? - C++
#include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;ctype.h&gt; using namespace std; int main() ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
srg_btl
34 / 34 / 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
642 / 563 / 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
34 / 34 / 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
34 / 34 / 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
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 18:33     Где ошибка? #9
Цитата Сообщение от SERUYBKR Посмотреть сообщение
Почему метод showArea(), в производных классах не виртуальный?
а кто тебе сказал что он не виртуальный?)
srg_btl
34 / 34 / 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++
#include&lt;conio.h&gt; #include&lt;iostream.h&gt; #include&lt;fstream.h&gt; #include&lt;stdio.h&gt; #define i 10 int x; char...

Где ошибка? С++ - C++
Задание на картинке #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { double x=3.4; double y=3.4; ...

Где ошибка? - C++
#include &lt;iostream&gt; using namespace std; int main() { int Fx=4, Fy=5, x, y, m; cin&gt;&gt;x; cin&gt;&gt;y; for(x=0; x&lt;7; x++) ...

где ошибка с++ - C++
include &lt;iostream&gt; using namespace std; char B = { 1,2,3,1 }; unsigned short s, n; unsigned long w; unsigned long A; void...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru