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

классы.посмотрите пожалуйста) - C++

Восстановить пароль Регистрация
 
Парапулька
 Аватар для Парапулька
0 / 0 / 0
Регистрация: 04.12.2010
Сообщений: 25
09.05.2011, 21:46     классы.посмотрите пожалуйста) #1
ребят
вот проблема у меня возникла
написала программу по этому заданию:
Создать класс int3, имитирующий стандартный тип. Написать программу, в которой будут созданы 3 объекта класса int3, два из которых будут инициализированы. Сложите два инициализированных объекта, присвойте результат третьему и отобразите результат на экране.
Но мой преподаватель её жутко раскритиковал
наговорил море каких-то не очень понятных для меня-новичка слов
и значит сказал переделывать
вот текст моей программы
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
#include <iostream>
#include <cmath>
using namespace std;
class int3
{
public: 
        int a;
        int b;
        int ();
        int3(int,int);
        int sum();
};
int main()
{       int n;
         int3 chislo(3,4);
cout << "chislo a = " << chislo.a << endl;
cout << "chislo b = " << chislo.b << endl;
cout << chislo.sum()<<endl;
  cin >> n;
}
int3::int3(int int1, int int2)
    {
    a=int1;
    b=int2;
    }
int int3::sum()
    {
    return a+b;
    }
прошу помогите,разъясните в чём же тут у меня какие недочёты
только прошу разъяснять не на уровне профессионала,
а всего лишь новичка)
спасибо заранее кто откликнется)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Veyron
 Аватар для Veyron
104 / 104 / 4
Регистрация: 02.06.2009
Сообщений: 579
09.05.2011, 21:52     классы.посмотрите пожалуйста) #2
вот это:
C++
1
2
3
4
int int3::sum()
        {
        return a+b;
        }
лучше переписать так:
C++
1
2
3
4
int3 operator +(int3& a, int3& b)
{
     return a+b;
}
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
09.05.2011, 22:03     классы.посмотрите пожалуйста) #3
Цитата Сообщение от Veyron Посмотреть сообщение
вот это:
лучше переписать так:
C++
1
2
3
4
int3 operator +(int3& a, int3& b)
{
     return a+b;
}
Блин! Ну сколько можно уже писать: по КОНСТАНТНОЙ ССЫЛКЕ параметры передавать надо!!!!
C++
1
2
3
4
int3 operator +(const int3& a, const int3& b)
{
     return a+b;
}
Парапулька
 Аватар для Парапулька
0 / 0 / 0
Регистрация: 04.12.2010
Сообщений: 25
09.05.2011, 22:04  [ТС]     классы.посмотрите пожалуйста) #4
ещё ругался по поводу
этого
C++
1
2
3
4
5
6
7
public: 
        int a;
        int b;
        int ();
        int3(int,int);
        int sum();
};
сказал что надо по другому создавать переменные класса описания
ну вобщем я не поняла(
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
09.05.2011, 22:10     классы.посмотрите пожалуйста) #5
Вот тебе отрывок из моей книги.
Сделай по аналогии...
Классы-оболочки встроенных типов
Преобразование типов позволяет нам обойти запрет на определение новых операций для встроенных типов. Для этого мы должны определить класс-оболочку для встроенного типа и реализовать в этом классе преобразование типов и требуемые операции. Давайте реализуем операцию возведения в целую степень для типа double. Класс-оболочка представлен в листинге 3.16.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Листинг 3.16. Класс-оболочка Real для double
class Real
{    double t;
  public:
    Real (const double &a=0.0){ t = a;}    // double -> Real
    operator double () { return t; }       // Real -> double
// "новая" операция возведения в целую степень
    Real operator^(int d) 
    { double r = t; 
      if (d==0) return 1;                  // t^0 = 1
      else if (r==0) return 0;             // 0^d = 0
      else if (d==1) return *this;         // t^1 = t
      else if (d<0) { r=1/r; d=-d; }       // t^(-d)=(1/t)^d
      double p = 1; 
      for(int i=1; !(i>d); i++) p* = r;    // вычисляем степень
      return p;                            // неявное преобразование
    }
};
Проверка показывает, что все варианты работают правильно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{    Real t = 2;
    cout << (t^0) << endl;            // 2^0 = 1
    cout << (t^1) << endl;            // 2^1 = 2
    t = 1;
    cout << (t^12)    << endl;        // 1^12 = 1
    cout << (t^-2)    << endl;        // 1^-2 = 1
    t = 0;
    cout << (t^0) << endl;            // 0^0 = 1
    cout << (t^3) << endl;            // 0^3 = 0
    t = 2;
    cout << (t^2)    << endl;         // 2^2 = 4
    cout << (t^-2)    << endl;        // 2^-2 = 0.25
    return 0;
}
Но надо помнить, что эта операция работает только для переменных типа Real — константы типа double таким способом возводить в степень не получится.
Таким образом, мы можем легко ввести «новые» арифметические операции для любого встроенного типа данных. Например, для int можно написать класс Integer, который инкапсулирует все, касающееся целых чисел. Собственно, мы действовали аналогично разработчикам языка программирования Java, реализовав тип-оболочку для встроенного типа данных.
Object
Заблокирован
09.05.2011, 22:12     классы.посмотрите пожалуйста) #6
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
int3 operator +(const int3& a, const int3& b)
{
return a+b;
}
бесконечная рекурсия?
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
09.05.2011, 22:13     классы.посмотрите пожалуйста) #7
Цитата Сообщение от Object Посмотреть сообщение
бесконечная рекурсия?
Надо поправить, конечно. Тем более, что в исходном классе - практически все неправильно, кроме конструктора...
Veyron
 Аватар для Veyron
104 / 104 / 4
Регистрация: 02.06.2009
Сообщений: 579
09.05.2011, 22:31     классы.посмотрите пожалуйста) #8
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
по КОНСТАНТНОЙ ССЫЛКЕ параметры передавать надо!!!!
Если по правильному стилю - то да. Но работать и так же будет.


Цитата Сообщение от Парапулька Посмотреть сообщение
ещё ругался по поводу
этого
Код C++1
2
3
4
5
6
7
8 public:
int a;
int b;
int ();
int3(int,int);
int sum();
};
сказал что надо по другому создавать переменные класса описания
ну вобщем я не поняла(
скорее всего из-за общего модификатора. Ничего не ставьте перед ними, они должны быть частными. Или перед их описанием напишите private.
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
09.05.2011, 22:33     классы.посмотрите пожалуйста) #9
Цитата Сообщение от Veyron Посмотреть сообщение
Если по правильному стилю - то да. Но работать и так же будет.
Будет. Но давай ходить в галошах - тоже ведь обувь!
Нельзя попустительствовать в мелочах!
KuKu
 Аватар для KuKu
1538 / 1016 / 69
Регистрация: 17.04.2009
Сообщений: 2,945
09.05.2011, 22:41     классы.посмотрите пожалуйста) #10
C++
1
2
3
4
5
6
7
8
9
class int3
{
public: 
        int a;
        int b;
        int ();
        int3(int,int);
        int sum();
};
Зачем тут a и b? Да и int (); что это ? И по-хорошему int a надо приватным сделать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2011, 02:54     классы.посмотрите пожалуйста)
Еще ссылки по теме:

посмотрите , пожалуйста ) чем отличается? C++
не могу найти ошибку.пожалуйста посмотрите C++
посмотрите пожалуйста почему она не работает C++

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

Или воспользуйтесь поиском по форуму:
Alligieri
CEO
Эксперт C++
 Аватар для Alligieri
2246 / 1235 / 24
Регистрация: 16.03.2009
Сообщений: 3,581
10.05.2011, 02:54     классы.посмотрите пожалуйста) #11
Парапулька, за качество прошу извинить - ночь уже, да и на с++ не пишу давно

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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class int3
{
    public: 
        int3();
        int3(int);
        int3 operator +(int3);
        operator int();
    private:
        int value;
};
 
int3::int3()
{
    this->value=0;
}
 
int3::int3(int value)
{
    this->value=value;
}
 
int3 int3::operator + (int3 other)
{
    return value+other;
}
 
int3::operator int()
{
    return this->value;
}
 
int main(void)
{
    int3 first(3);
    int3 second(4);
 
    int3 result;
 
    result=first+second;
 
    cout<<first<<"+"<<second<<"="<<result;
 
    getch(); //для задержки - можно убрать
    return 0;
}
Yandex
Объявления
10.05.2011, 02:54     классы.посмотрите пожалуйста)
Ответ Создать тему
Опции темы

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