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

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

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

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

11.03.2013, 16:57. Просмотров 375. Ответов 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;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 16:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где ошибка? (C++):

Вывести на экран количество слов где первая и последняя буквы одинаковы (не понимаю где ошибка) - C++
задан текст нужно вывести на экран количество слов где первая и последняя буквы одинаковы #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Подскажите, где может быть ошибка (структуры)? (скорее всего где-то амперсенд нужен, все вроде проверил) - C++
написать универсальный тип, который представляет точку на плоскости в координатах (х, у) и в полярных координатах. Написать функцию для...

Укажите где ошибка (ошибка во время выполнения программы) - C++
Здравствуйте, помогите пожалуйста найти ошибки в коде которые возникаю при выполнении программы Картинка с ошибкой внизу поста. Код: ...

Ошибка при компиляции. Где ошибка? (Работа с классом) - C++
Уважаемые форумчане! При компиляции проекта возникает ошибка &quot; undefined reference to `MeterNZiF::MeterNZiF()' &quot; на 7 строку приложения. ...

В чём ошибка.В коде там где коментарий там ошибка поучается. - C++
#include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; class CMyString{ char *pStr; public: ...

Где ошибка ? - C++
Даны числа x и n . Вычислить S=sin(x)+sin(sin(x))+.....+sin(sin....sin(x)). n Моя...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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;
1
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);
будет неизвестое значение
1
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)
    {
  
    }
В этом случае ты сразу вызываешь для них конструктор с нужными параметрами. И не забывай про порядок, вызывай конструкторе в таком же порядке ккак и обьявлены элементы в классе. если х первый стоит то сначала для него вызываешь, или наоборот с у.
1
spaun13
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 13
11.03.2013, 17:33  [ТС] #5
Спасиб Щас пишет последняя фигурная скобка ее нету.......
0
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;
    }
если они у тебя не меняються, лучше сразу в конструкторе вычислить а потом просто возвращать значения
1
spaun13
0 / 0 / 0
Регистрация: 05.03.2013
Сообщений: 13
11.03.2013, 18:09  [ТС] #7
Да все норм!)
0
xSCJx
22 / 19 / 1
Регистрация: 24.12.2012
Сообщений: 435
11.03.2013, 18:19 #8
Почему метод showArea(), в производных классах не виртуальный?
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 18:33 #9
Цитата Сообщение от SERUYBKR Посмотреть сообщение
Почему метод showArea(), в производных классах не виртуальный?
а кто тебе сказал что он не виртуальный?)
0
srg_btl
34 / 34 / 2
Регистрация: 21.02.2013
Сообщений: 90
11.03.2013, 18:37 #10
Если базовый класс имеет виртуальный метод, то этот метод в производных классах также виртуальный, и нет смысла писать виртуал, хотя для удобства можно и написать.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.03.2013, 18:39 #11
Цитата Сообщение от srg_btl Посмотреть сообщение
и нет смысла писать виртуал, хотя для удобства можно и написать.
есть определенный смысл, как советует Майерс - лучше писать всегда, чтобы потом наследуясь от производного класса не забыть что этот метод виртуальный
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.03.2013, 18:39
Привет! Вот еще темы с ответами:

Где ошибка? - C++
if(x&lt;=0) {y=((sin(x+3))/(pow(x,5)*tan(2*pow(x,3)))); plot1-&gt;Points-&gt;AddXY(x, y);} else if (x&gt;0&amp;&amp;x&lt;5) {y=...

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

Где ошибка ? - C++
Найти наибольший общий делитель для двух целых чисел. #include &lt;iostream&gt; using namespace std; int main() { int a,b; ...

Где ОШИБКА? - C++
есть программа которая выводит массив рандомных чисел, (размерность массива:200, диапазон значений: 0-100 ) и подсчитывает количество...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.03.2013, 18:39
Ответ Создать тему
Опции темы

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