Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2011, 15:30   #1
Ramil1991
Новичок
Джуниор
 
Регистрация: 21.01.2011
Сообщений: 2
Вопрос Обобщенные классы в С++

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


Код:
#include <stdafx.h>
#include<stdio.h>
#include <iostream.h>

template <class T> class complex
{
    T a, b;

    public:

        void set_number(T x, T y) {a=x; b=y;}; //создает комплексное число
        int get_X(){return a;}; //возвращает Х
        int get_Y(){return b;}; //возвращает У

        void print_number(){ //печатает число
            cout << get_X() <<";"<<get_Y();
        }

    

};//<-end of class


int main(void)
{    
    complex<int> first, second, result;

    int choice, x, y;
    
    do {
        cout << endl;
        printf("Menju:\n");
        printf("[1] Vvesti chisla\n");
        printf("[2] Vyvesti chisla\n");
        printf("[3] Slozhit' chisla\n");
        printf("[4] Vichest' odno chislo iz drugogo\n");
        printf("[5] Umnozhit' odno chislo na drugoe\n");
        printf("[6] Vyhod\n\n");
        
        printf("Vash vibor: ");
        cin >> choice;
        printf("\n");
        
        switch(choice)
        {
            case 1: {

                cout << "Input X and Y of number #1 " << endl;//создаем первое число
                cin >> x >> y;
                first.set_number(x,y); 

                cout << "Input X and Y of number #2 " << endl;//создаем второе число
                cin >> x >> y;
                second.set_number(x,y);

                break;
            }
            
            case 2: {
                
                cout << "Pervoe 4islo: ("; //печатаем первое число
                first.print_number(); 
                cout <<")"<<endl;
                cout << "Vtoroe 4islo: ("; //печатаем второе число
                second.print_number(); 
                cout <<")"<<endl;

                break;
            }
                
            case 3: {

                result.set_number(first.get_X()+second.get_X(),first.get_Y()+second.get_Y()); //складываем числа

                cout <<"Summa 4isel = ("; //печатаем результат
                result.print_number();
                cout<<")"<<endl;

                break;
            }

                
            case 4:{

                int n;

                cout<<"Iz kakogo 4isla vy4itat' ?"<<endl;
                cin>>n;

                if(n==1){ //вычитаем второе из первого
                    result.set_number(first.get_X()-second.get_X(),first.get_Y()-second.get_Y());
                }
                else { //вычитаем первое из второго
                    result.set_number(second.get_X()-first.get_X(),second.get_Y()-first.get_Y());
                }

                cout <<"Raznost' 4isel = ("; //печатаем результат
                result.print_number();
                cout<<")"<<endl;
        
                break;
            }
    
            case 5:{
                //перемножаем числа
                result.set_number(first.get_X()*second.get_X(),first.get_Y()*second.get_Y()); 

                cout <<"Proizvedenie 4isel = ("; //печатаем результат
                result.print_number();
                cout<<")"<<endl;
            
                break;
            }
                    
            default:
                printf("Oshibka! Takogo punkta menju ne sushhestvuet.\n\n");
                
                break;
        }
    } while(choice != 6);

    return 0;
}
Написал код, прога работает, после проверки преподователем оказалось что прогарамма написана не правильно, и писать нужно используя перегрузку. Тоесть чтобы в самом классе была функция которая перегружает операции сложения вычитания и умножения? я правильно понимаю? могли бы продемонстрировать как перегрузка выглядит на сложении? чтобы понять

Последний раз редактировалось ACE Valery; 21.01.2011 в 23:26.
Ramil1991 вне форума Ответить с цитированием
Старый 21.01.2011, 16:30   #2
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

тут есть примеры перегрузки операторов: http://www.firststeps.ru/theory/c/r.php?13
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 21.01.2011, 23:55   #3
Ramil1991
Новичок
Джуниор
 
Регистрация: 21.01.2011
Сообщений: 2
По умолчанию

хотелось бы улицезреть конкретно в моем примере, если не трудно показать перегрузку хотя бы сложения, или исправить мой вариант, правильно ли я понял
код :

Код:
template <class T> class complex
{............
.... 
cout.....

complex operator+(ob1,ob2) // функция перегрузки оператора сложения
{ T c;
c.a(или x)=ob1.a(x)+ob2.a(x);
c.b(или y)=ob1.b(y)+ob2.b(y);
return c;
}
}

int main(void)
{    
    complex<int> first, second, result;

    int choice, x, y;
 result=first+second;

............

}
так это должно выглядить?

Последний раз редактировалось ACE Valery; 22.01.2011 в 01:42.
Ramil1991 вне форума Ответить с цитированием
Старый 22.01.2011, 07:42   #4
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

Код:
template <class T>
 class complex
{
public:
	T a, b;
	complex operator +( complex ob1); // функция перегрузки оператора сложения
	complex operator =( complex ob1); // функция перегрузки оператора присвоения

};

template <class T>
 complex<T> complex< T>::operator +( complex ob1) // функция перегрузки оператора сложения
{
  complex<T> c;
  c.a = ob1.a + this->a;
  c.b = ob1.b + this->b;
return c;
}

template <class T>
 complex<T> complex< T>::operator =( complex ob1) // функция перегрузки оператора присвоения
{
  a = ob1.a;
  b = ob1.b;
return ob1;
}

int main(void)
{
	complex<int> first, second, result;
	first.a =1;
	first.b =3;
	second.a =5;
	second.b =7;

	result = first + second;

return 0;
}
Вот так

Последний раз редактировалось An1ka; 22.01.2011 в 07:51.
An1ka вне форума Ответить с цитированием
Старый 22.01.2011, 13:27   #5
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

2Anika это не эффективно а оператор присваи вания еще и не правильный


Код:
template <class T>
inline complex <T>& complex <T>::operator= (const complex & rkV)
{
     if(*this == complex ) return *this;
     this->a = rkV.a;
     this->b = rkV.b;
    return *this;
}

template <class  T>
inline complex <T> complex <T>::operator+ (const complex& rkV) const
{
    return complex (
        this->a+rkV.a,
        this->b+rkV.b);
}

Последний раз редактировалось like-nix; 22.01.2011 в 13:32.
like-nix вне форума Ответить с цитированием
Старый 22.01.2011, 13:55   #6
An1ka
C++,DirectX/OpenGL
Форумчанин
 
Регистрация: 09.01.2011
Сообщений: 422
По умолчанию

2like-nix, может сначала хотя бы будем проверять, прежде, чем такие выводы делать ??
Так как раз таки у вас он и не эффективный, потому что требует еще определенного конструктора и перегрузки операции проверки на равенство...
An1ka вне форума Ответить с цитированием
Старый 22.01.2011, 14:51   #7
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

An1ka, like-nix прав хотя бы в том, что лучше передавать константную ссылку на объект, а не сам объект. Потому что иногда объекты бывают с кучей разных свойств, и нечего их туда-сюда в функции кидать. Ссылка все же меньше.

Код:
template <class T>
 complex<T> complex< T>::operator =( complex ob1) // функция перегрузки оператора присвоения
{
  a = ob1.a;
  b = ob1.b;
return ob1;
}
Эм... ну если вы считаете это правильным, объясните, пожалуйста: вы возвращаете ob1, нафига вы this'у присваиваете значения этого ob1? (a = ob1.a; b = ob1.b; )
Подгон решения под правильный ответ не во всех случаях спасает

А прежде чем наезжать на критиков, сперва сами посмотрите, все ли в порядке с вашим кодом
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 22.01.2011 в 15:04.
ACE Valery вне форума Ответить с цитированием
Старый 22.01.2011, 15:22   #8
like-nix
Форумчанин
 
Регистрация: 09.11.2009
Сообщений: 104
По умолчанию

Объяснение
http://liveworkspace.org/code/1cecb2...f2c3bc7bb57100

Последний раз редактировалось like-nix; 22.01.2011 в 15:29.
like-nix вне форума Ответить с цитированием
Старый 22.01.2011, 16:17   #9
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Простите, я тут влезу и сделаю не по вопросу темы исправления.
Код:
#include <stdafx.h>
#include<stdio.h>
#include <iostream.h>
Первое не нужно, второе надо подключать как <cstdio>, а третье как <iostream>. Да и лучше использовать только iostream, вы же пишите на C++.

Код:
int main(void)
{
    // ...    
    return 0;
}
Упростите это до:
Код:
int main()
{
    // ...
}
Т.к. в C++ main и так вернёт ноль, если дойдёт до конца, а void в качестве аргумента нужен был в C, кажется, лет 30 назад, если вообще нужен был.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 22.01.2011, 16:23   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Первое не нужно
студия требует(если не отключено создание предкомпилированого заголовка)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ классы. savva Помощь студентам 5 07.07.2010 19:44
С++ классы KOLYTFR Помощь студентам 1 04.06.2009 19:58
классы elenSV Общие вопросы C/C++ 0 31.05.2009 09:48
Классы Sasuke-sama Общие вопросы C/C++ 8 30.05.2009 15:15