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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2011, 20:51   #1
Erisu
 
Регистрация: 17.05.2011
Сообщений: 4
По умолчанию C++, переопределение ввода-вывода

Решите, пожалуйста, если не трудно)
Переопределить операции << и >> для ввода-вывода матриц размерностью m*n, где m и n кон-станты. Матрица хранится в классе.
Erisu вне форума Ответить с цитированием
Старый 03.06.2011, 21:30   #2
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию

Код:
ostream& operator<<(ostream& out, const Matrix& matrix)
{
    for(int i = 0; i < matrix.m; i++)
    {
        for(int j = 0; j < matrix.n; j++)
             out << matrix.arr[i][j] << " ";
        out << endl;
    }
    return out;
}

istream& operator>>(istream& in, const Matrix& matrix)
{
    for(int i = 0; i < matrix.m; i++)
        for(int j = 0; j < matrix.n; j++)
             in >> matrix.arr[i][j];
    return in;
}
Объявить в классе эти функции нужно как дружественные
N1KeL вне форума Ответить с цитированием
Старый 03.06.2011, 21:31   #3
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
Решите, пожалуйста
Наконец-то, не "помогите", а честный человек! Да без проблем, только покажи свой класс матрицы, иначе переопределять не для чего.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 03.06.2011, 22:13   #4
Lanx
 
Регистрация: 06.04.2011
Сообщений: 8
По умолчанию

О, ребята, объясните, пожалуйста, в чем тут смысл работы со ссылками, подробнее. А то перегружать эти операторы-то я умею, но никогда не мог понять, причем там ссылки. Ведь ссылки обычно используются методами для изменения содержимого переданных им переменных и позволяют "возвращать"(программно, конечно, изменять) несколько переменных, в отличие от оператора return. Я так понимал, что они для этого используются. А для чего здесь возвращать ссылку на объект ostream(istream), если он все равно в итоге один? Неужели если оператор вернет объект, цепочка не построится? "cout << Name << Surname;" - "cout << Name" вернет ostream, к которому в свою очередь применяется следующий "<<", который применяется уже к Surname и к возвращенному результату. Подобно тому, как оператор "+" выстраивает цепочки для, например, целых чисел: a + b + c ...

или он возвращает все-таки объект? но ведь тип возвращаемого значения - ссылка на объект, а не объект.
Lanx вне форума Ответить с цитированием
Старый 03.06.2011, 22:36   #5
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Lanx Посмотреть сообщение
О, ребята, объясните, пожалуйста, в чем тут смысл работы со ссылками, подробнее. А то перегружать эти операторы-то я умею, но никогда не мог понять, причем там ссылки. Ведь ссылки обычно используются методами для изменения содержимого переданных им переменных и позволяют "возвращать"(программно, конечно, изменять) несколько переменных, в отличие от оператора return. Я так понимал, что они для этого используются. А для чего здесь возвращать ссылку на объект ostream(istream), если он все равно в итоге один? Неужели если оператор вернет объект, цепочка не построится? "cout << Name << Surname;" - "cout << Name" вернет ostream, к которому в свою очередь применяется следующий "<<", который применяется уже к Surname и к возвращенному результату. Подобно тому, как оператор "+" выстраивает цепочки для, например, целых чисел: a + b + c ...

или он возвращает все-таки объект? но ведь тип возвращаемого значения - ссылка на объект, а не объект.
Раз мы принимаем оригинальный объект, а не его копию, то и вернуть правильнее будет этот самый объект, а не плодить копии. Это касается не только классов istream и ostream. Возвращать объект по ссылке всегда эффективнее, чем по значению ввиду того, что вернется сам объект и не будет тратиться время и память на создание копии.
N1KeL вне форума Ответить с цитированием
Старый 03.06.2011, 23:32   #6
Lanx
 
Регистрация: 06.04.2011
Сообщений: 8
По умолчанию

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

Код:
void f1 (int &a, int &b) //функция, которая принимает адреса переменных a и b
{
  //насколько я понимаю, ссылки автоматически разименовываются, то есть  a эквивалетно здесь *(&a)
 a = 5*a; b = 10*b; //произошло следующее: функция разименовала содержимое по адресу &a, затем изменила его. также и с &b
}
void main() {int a = 5, b = 10; //значения переменных равны 5 и 10 f1(&a,&b); //значения переменных стали 25 и 100
у меня тут вообще понятие возврата в голове не укладывается. я когда работал с абстрактным типом данных, писал такие функции, и без проблем все без возврата работало. нужные значения изменялись. почему в случае оператора нельзя также сделать, в чем там разница?

я строю все домыслы на предположении, что ссылки суть значения указателей, только разименовываются без "*". может, это неправда, и оно как-то по-другому реализуется.
Lanx вне форума Ответить с цитированием
Старый 04.06.2011, 11:44   #7
N1KeL
Пользователь
 
Аватар для N1KeL
 
Регистрация: 20.04.2009
Сообщений: 58
По умолчанию

Цитата:
Сообщение от Lanx Посмотреть сообщение
Я всегда думал, что это на машинном уровне есть адрес некой переменной.
Да, если вдаваться в детали, то ссылка - это константный указатель (можно менять значение переменной, но нельзя менять ее адрес):
Код:
int& k = r;
int* const z = &r;
В данном случае, k аналогично *z

Цитата:
Сообщение от Lanx Посмотреть сообщение
Код:
void f1 (int &a, int &b) //функция, которая принимает адреса переменных a и b
{
  //насколько я понимаю, ссылки автоматически разименовываются, то есть  a эквивалетно здесь *(&a)
 a = 5*a; b = 10*b; //произошло следующее: функция разименовала содержимое по адресу &a, затем изменила его. также и с &b
}
void main() {int a = 5, b = 10; //значения переменных равны 5 и 10 f1(&a,&b); //значения переменных стали 25 и 100
1. a ВСЕГДА эквивалетно *(&a). Это бессмысленное разыменование
2. Ничего функция не разыменовывала. Ссылка это уже "разыменованный указатель", т.е. та же самая переменная на которую она ссылается, только с другим именем.

Цитата:
Сообщение от Lanx Посмотреть сообщение
у меня тут вообще понятие возврата в голове не укладывается. я когда работал с абстрактным типом данных, писал такие функции, и без проблем все без возврата работало. нужные значения изменялись. почему в случае оператора нельзя также сделать, в чем там разница?
Можно и с операторами так сделать, но тогда не будет работать конструкция вида:
cout << a << b;

Цитата:
Сообщение от Lanx Посмотреть сообщение
я строю все домыслы на предположении, что ссылки суть значения указателей, только разименовываются без "*". может, это неправда, и оно как-то по-другому реализуется.
Как я написал выше, ссылки не разыменовываются.
Мой вам совет - обратиться к дополнительной литературе и почитать о ссылках.

Последний раз редактировалось N1KeL; 04.06.2011 в 11:46.
N1KeL вне форума Ответить с цитированием
Старый 15.06.2011, 19:44   #8
Erisu
 
Регистрация: 17.05.2011
Сообщений: 4
По умолчанию

вот на что хватило фантазии:
//Unit1.cpp
Цитата:
#include <iostream.h>
#include <fstream.h>
int main(int argc, char* argv[])
{
matrix **a;
int m,n;
cout<<"Vvedite chisla:";
cin>>a;
cout<<a;
getchar();getchar();
return 0;}
//File1.h
Цитата:
#ifndef _File1_H
#define _File1_H
#include "iostream.h"

const int m=3;
const int n=3;
class matrix
{
int **a;
public:
matrix(int ,int );
friend ostream& operator<<(ostream& out,const matrix&a)
{
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
out <<a.mat[i][j]<< " ";
cout << endl;
return out;
}
friend istream& operator >>(istream&in,matrix&a)
{
in>>(int)a.mat[i][j];
cout << endl;
return in;
}
};
matrix::matrix(int m,int n)
{
{
int **mat;
*mat = new int*[m*sizeof(int)];
for (int z=0; z<n; z++)
mat[z] = new int[n*sizeof(int)];
}
for (int z=0; z<n; z++)
mat[z] = new int[n*sizeof(int)];
delete *mat;
delete[] mat;
};
#endif
не подскажете, где ошибка и как можно ее исправить, а то никак не доходит((
Erisu вне форума Ответить с цитированием
Старый 16.06.2011, 04:18   #9
l1pton17
Пользователь
 
Аватар для l1pton17
 
Регистрация: 01.11.2010
Сообщений: 75
По умолчанию

Дружественная фунеция описывается вне класса, в самом классе только прототип функции с ключевым словом friend. Также посмотри ещё раз на свой конструктор, что-то с ним не то. И допиши деструктор, иначе память будет засоряться.
Вот примерно так должно выглядить:
#ifndef _File1_H
#define _File1_H
#include "iostream.h"

const int m=3;
const int n=3;
class matrix
{
int **mat;
public:
matrix(int ,int );
friend ostream& operator<<(ostream& out,const matrix &a);
friend istream& operator>>(istream& in, matrix &a);
~matrix()
{
//опиши здесь деструктор
}
};

ostream& operator<<(ostream& out,const matrix&a);
{
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
out <<a.mat[i][j]<< " ";
cout << endl;
return out;
}

istream& operator >>(istream&in,matrix&a);
{
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
in>>(int)a.mat[i][j];
cout << endl;
return in;
}

matrix::matrix(int m,int n)
{
*mat = new int*[m*sizeof(int)];
for (int z=0; z<n; z++)
mat[z] = new int[n*sizeof(int)];
}
#endif
l1pton17 вне форума Ответить с цитированием
Старый 16.06.2011, 16:27   #10
Erisu
 
Регистрация: 17.05.2011
Сообщений: 4
По умолчанию

Все, спасибо. Проблема решена, тему можно закрывать)
Erisu вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Операторы ввода и вывода wsws123 Паскаль, Turbo Pascal, PascalABC.NET 2 04.01.2011 18:12
переопределение ввода и вывода в С++ blackbanny Помощь студентам 12 03.05.2010 13:08
Перенаправление ввода/вывода dudeboy Win Api 0 16.11.2009 11:36
JavaScript поля ввода/вывода Doublefaced Помощь студентам 2 03.06.2009 01:36
система ввода вывода StudentPolitech Общие вопросы C/C++ 3 02.04.2009 22:22