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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2012, 14:24   #1
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию С++ использование шаблонов

Приветствую всех на форуме. Написал код с использованием шаблонов. Задание звучит так :

1. Реализовать класс комплексных чисел complex. Переопределить
операции сложения, вычитания и ввод/вывод в поток.
2. Создать шаблон класса матриц. Переопределить операции
сложения, вычитания, присваивания и ввод/вывод в поток.
3. Проверить работоспособность шаблона класса матриц для данных
int, float, complex.

Вот соответственно мой код.
Код C++:
Код:
 
#include <iostream>
#include <conio.h>
#include <string.h>
 
using namespace std;
 
//===class_complex=====
class Complex
{
     int Im, Re;
     
     public:
        Complex(int c = 0, int d = 0){cout<<"Constructor Complex\n"; Re = c; Im = d;}
        Complex & operator+(Complex & c);
        Complex & operator-(Complex & c);
        Complex & operator=(Complex & c);
        friend ostream & operator<<(ostream & out_stream, Complex &);
        friend istream & operator>>(istream & in_stream, Complex &);
};
 
Complex & Complex::operator+(Complex & c)
{   
    //Complex temp;
    Re = Re + c.Re;
    Im = Im + c.Im;
    return (*this);
}
 
Complex & Complex::operator-(Complex & c)
{   
    //Complex temp;
    Re = Re - c.Re;
    Im = Im - c.Im;
    return (*this);
}
 
Complex & Complex::operator=(Complex & c)
{   
    Re = c.Re;
    Im = c.Im;
    return (*this);
}
 
 
ostream & operator<<(ostream & out_stream, Complex & complex)
{   
    out_stream<<"\n"<<complex.Re<<"+"<<complex.Im<<"i"<<endl;
    return out_stream;
}
 
istream & operator>>(istream & in_stream, Complex & complex)
{   
    cout<<endl;
    cout<<"Re =";
    in_stream>>complex.Re;
    cout<<"Im =";
    in_stream>>complex.Im;
 
    return in_stream;
}
 
/*====class_matrix=====*/
template <typename T> class Matrix
{
    T ** m;
    int string;
    int column;
    
    public:
        Matrix(int string, int column);
        friend istream & operator>> <>(istream &, Matrix<T> &);
        friend ostream & operator<< <>(ostream &, const Matrix<T> &);
        Matrix<T> & operator+(Matrix<T> &);
        Matrix<T> & operator-(Matrix<T> &);
        Matrix<T> & operator=(Matrix<T> &);
};
 
template <typename T> Matrix<T>::Matrix(int str, int col)
{
        int i, j;
        
        cout<<"\nThe Constructor of Matrix\n";
        string = str; 
        column = col;
        
        m = new T * [string];
        
        for(i = 0; i < string; i++)
        {
            m[i] = new T[column];
        }
}
 
template <typename T> istream & operator>>(istream & in_stream, Matrix<T> & Matr)
{
    int i, j;
    
    for(i = 0; i < Matr.string; i++)
    {
        for (j = 0; j < Matr.column; j++)
        {
            cout<<"M["<<(i + 1)<<"]["<<(j + 1)<<"]=";
            in_stream>>Matr.m[i][j];
        }
    }
    return in_stream;
}
 
template <typename T> ostream & operator<<(ostream & out_stream, const Matrix<T> & Matr)
{
    int i, j;
    
    for(i = 0; i < Matr.string; i++)
    {
        for(j = 0; j < Matr.column; j++)
        {
            out_stream<<"\t"<<Matr.m[i][j];
        }
        cout<<"\n";
    }
    return out_stream;
}
 
template <typename T> Matrix<T> & Matrix<T>::operator+(Matrix<T> & mtr)
{
     //matrix<T> temp(string, column);
     int i, j;
     
     for(i = 0; i < string; i++)
           for(j = 0; j < column; j++)
                m[i][j] = m[i][j] + mtr.m[i][j];
     return(*this);
}
              
template <typename T> Matrix<T> & Matrix<T>::operator-(Matrix<T> & mtr)
{
     //matrix<T> temp(row, col);
     int i, j;
     
     for(i = 0; i < string; i++)
           for(j = 0; j < column; j++)
                m[i][j] = m[i][j] - mtr.m[i][j];
     return(*this);
}
 
template <typename T> Matrix<T> & Matrix<T>::operator=(Matrix<T> & mtr)
{
     int i, j;
     
     for(i = 0; i < string; i++)
            for(j = 0; j < column; j++)
                m[i][j] = mtr.m[i][j];
     return (*this);
}
 
int main()
{
    Matrix <int> ob_1(3, 3), ob_2(2, 2);
    cout<<"Enter the values (int) : "<<endl;
    cin>>ob_1;
    cin>>ob_2;
 
    cout<<"integer + integer : \n"<<(ob_1 + ob_2);
    cout<<"integer - integer : \n"<<(ob_1 - ob_2);
 
    Matrix <float> ob_3(2.0, 3.0), ob_4(4.0, 5.0);
    cout<<"Enter the values (float) : "<<endl;
    cin>>ob_3;
    cin>>ob_4;
    cout<<"float + float : \n"<<(ob_3 + ob_4);
    cout<<"float - float : \n"<<(ob_3 - ob_4);
 
    Matrix <Complex> complex_1(2, 4), complex_2(3, 5);
    cout<<"Enter the values (complex) : "<<endl;
    cin>>complex_1;
    cin>>complex_2;
 
    cout<<"complex + complex : \n"<<(complex_1 + complex_2);
    cout<<"complex - complex : \n"<<(complex_1 - complex_2);
    getch();
    return 0;
}
Помогите пожалуйста найти ошибку в коде, уже столько учебников перекопал, а прийти к нормальному результату не получается..Если не трудно, то помогите исправить.

Последний раз редактировалось Alex-Kunfuman; 14.11.2012 в 14:52.
Alex-Kunfuman вне форума Ответить с цитированием
Старый 14.11.2012, 14:32   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

0) Оформляйте код тегом форума CODE, пожалуйста.
1) Почему Вы считаете, что ошибка есть и в чём она выражается?
Abstraction вне форума Ответить с цитированием
Старый 14.11.2012, 14:42   #3
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию

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

Последний раз редактировалось Alex-Kunfuman; 14.11.2012 в 14:45.
Alex-Kunfuman вне форума Ответить с цитированием
Старый 14.11.2012, 14:51   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

*вздох*

Есть два варианта: либо программа компилируется, либо не компилируется.
- Если программа не компилируется, есть два варианта: либо ошибку выдаёт компилятор, либо компоновщик.
- - Если ошибку выдаёт компилятор, у Вас есть текст ошибки; этот текст указывает также строку, которую компилятор соотносит с ошибкой. Было бы желательно привести первое и второе.
- - Если ошибку выдаёт компоновщик, у Вас есть текст ошибки. Было бы желательно его привести.
- Если программа компилируется, есть два варианта: она либо "падает", не выдавая никакого результата, либо порождает неверный результат.
- - Если программа "падает", использование отладчика позволяет найти строку в исходном коде, соотносимую с точкой падения. Было бы желательно её привести.
- - Если программа компилируется, компонуется, запускается, работает и порождает неверный результат, это происходит на некотором, известном Вам, наборе входных данных. Желательно привести этот набор, ожидаемый результат работы программы и реальный результат работы программы.

Какой бы вариант из четырёх ни реализовывался, для ответа вам придётся написать сообщение заметно короче этого моего.
Abstraction вне форума Ответить с цитированием
Старый 14.11.2012, 15:08   #5
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию

вот всё, что имеется:
===================

In instantiation of `Matrix<int>':
160 C:\Users\HP\Desktop\Lab_7(task2).cp p instantiated from here

71 C:\Users\HP\Desktop\Lab_7(task2).cp p template-id `operator>><>' for `std::basic_istream<char, std::char_traits<char> >& operator>>(std::basic_istream<char, std::char_traits<char> >&, Matrix<int>&)' does not match any template declaration

72 C:\Users\HP\Desktop\Lab_7(task2).cp p template-id `operator<< <>' for `std::basic_ostream<char, std::char_traits<char> >& operator<<(std::basic_ostream<char, std::char_traits<char> >&, const Matrix<int>&)' does not match any template declaration

коммент: то же самое и для float и для Complex

C:\Users\HP\Desktop\Lab_7(task2).cp p In function `int main()':

168 C:\Users\HP\Desktop\Lab_7(task2).cp p [Warning] passing `double' for converting 1 of `Matrix<T>::Matrix(int, int) [with T = float]'

C:\Users\HP\Desktop\Lab_7(task2).cp p In function `std::istream& operator>>(std::istream&, Matrix<T>&) [with T = int]':
162 C:\Users\HP\Desktop\Lab_7(task2).cp p instantiated from here
66 C:\Users\HP\Desktop\Lab_7(task2).cp p `int Matrix<int>::string' is private
98 C:\Users\HP\Desktop\Lab_7(task2).cp p within this context
67 C:\Users\HP\Desktop\Lab_7(task2).cp p `int Matrix<int>::column' is private
65 C:\Users\HP\Desktop\Lab_7(task2).cp p `int**Matrix<int>::m' is private
....
для ввода в поток тоже самое...
вот и ошибки, программа не компилируется никак.
Вы можете мне помочь исправить код?

Последний раз редактировалось Alex-Kunfuman; 14.11.2012 в 15:11.
Alex-Kunfuman вне форума Ответить с цитированием
Старый 14.11.2012, 15:21   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
71 C:\Users\HP\Desktop\Lab_7(task2).cp p template-id `operator>><>' for `std::basic_istream<char, std::char_traits<char> >& operator>>(std::basic_istream<char, std::char_traits<char> >&, Matrix<int>&)' does not match any template declaration
Что говорит компилятор, в вольном переводе: "Хозяин! Ты тут пытаешься использовать вот такую функцию (декларатор), а она нигде не объявлена. Я так не умею..."
Как мне подсказывает память, template и friend друг с другом в достаточно скверных отношениях. Такую конструкцию -
Код:
friend istream & operator>> <>(istream &, Matrix<T> &);
- VS 2010 у меня сожрала, а Ваш компилятор (какой?), видимо, не переварил. Попробуйте убрать из заголовка <> и включить тело функции в класс - может, поможет. Нет, не поможет. Плохо. Вот такое извращение собралось:
Код:
//В классе
        template <typename T2> friend istream & operator>> (istream &, Matrix<T2> &);

//В реализации
template <typename T2>
istream & operator>>(istream & in_stream, Matrix<T2> & Matr)
{//...

Последний раз редактировалось Abstraction; 14.11.2012 в 16:04.
Abstraction вне форума Ответить с цитированием
Старый 14.11.2012, 15:28   #7
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию

Нет не помогает, уже пробовал...несколько раз пробовал..меня уже переклинивает эта программа. я просто не вижу ошибки...сейчас компилирую на Dev-C++, на MS V2010 тоже пробовал, такая же ситуация...
Alex-Kunfuman вне форума Ответить с цитированием
Старый 14.11.2012, 15:47   #8
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А вообще, Вам необходимо организовывать вывод через оператор сдвига, или, может, всё же можно написать функцию-член?
Abstraction вне форума Ответить с цитированием
Старый 14.11.2012, 15:55   #9
Alex-Kunfuman
Пользователь
 
Регистрация: 19.01.2012
Сообщений: 20
По умолчанию

нет, нужно именно перегрузить оператор сдвига...и использовать его.

Последний раз редактировалось Alex-Kunfuman; 14.11.2012 в 16:00.
Alex-Kunfuman вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Использование функций-шаблонов. killeraleksana Помощь студентам 0 10.05.2012 22:44
использование шаблонов Diego__ Общие вопросы C/C++ 6 13.03.2012 01:08
Создание шаблонов artemavd Общие вопросы Delphi 4 29.09.2010 17:21
Использование шаблонов s180 Microsoft Office Word 5 10.12.2009 16:17