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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2010, 12:41   #1
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию переопределение ввода и вывода в С++

два файла pointer.h и 1.cpp
pointer.h
Код:
#pragma once

class Pointer
{
public:
	Pointer();
	Pointer(int**,int size);
	Pointer(Pointer&);
	~Pointer();
	void Display();
    int RowLength(int *p);//длина строки p;*
	int GetElement(int row,int pos);//вернуть элемент из строки row ,имеющий позтицию pos
    bool Compare(Pointer&);
	void Add(Pointer&);
	void Mul(Pointer&);
	Pointer operator +(Pointer &);
	Pointer operator *(Pointer &);
	Pointer& operator = (Pointer &);
	friend ostream operator << (ostream &O, Pointer &p);
protected:
	int **pArray;
	int Length;
};
и кусок 1.cpp на переопределение вывода в поток:
Код:
friend ostream operator << (ostream &O, Pointer &p)
{
 int a = p.Length;
	
 Pointer m;
	
 O << m.pArray << endl;

            for (int i=0;i<=p.Length; i++)
                        m.pArray[i] = p.pArray[i];
                        O << m.pArray[i] << " ";

            O << endl;

            return O; }
честно говоря не знаю как написать правильно, ругается на строку:

Код:
friend ostream operator << (ostream &O, Pointer &p);
в pointer.h
blackbanny вне форума Ответить с цитированием
Старый 02.05.2010, 13:39   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

возможно
friend ostream& operator << (ostream &O, Pointer &p);
rrrFer вне форума Ответить с цитированием
Старый 02.05.2010, 13:41   #3
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
возможно
friend ostream& operator << (ostream &O, Pointer &p);
все равно не работает...
blackbanny вне форума Ответить с цитированием
Старый 02.05.2010, 13:49   #4
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

#include <iomanip> нужен или <iostream>
при описании пишите:
friend ostream& operator << (ostream &O, Pointer &p);
при реализации:
Код:
ostream& operator << (ostream &O, Pointer &p){
//...
}
и еще у вас имхо ошибка:
Код:
for (int i=0;i<=p.Length; i++)
                        m.pArray[i] = p.pArray[i];
                        O << m.pArray[i] << " ";//тут переменная i недоступна
вот вобщем:
Код:
#include <iomanip>
using std::ostream;
class Pointer{
public:
	friend ostream& operator << (ostream &O, Pointer &p);
};
ostream& operator << (ostream &O, Pointer &p){
    return O; 
}

Последний раз редактировалось Stilet; 03.05.2010 в 12:12.
rrrFer вне форума Ответить с цитированием
Старый 02.05.2010, 14:11   #5
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию

просто нужно было написать во всех файлах using namespace std;
и код вот такой получился
Код:
	friend ostream &operator << (ostream & , Pointer &);
Код:
ostream operator << (ostream &O, Pointer &T)
{
 int a = T.Length;

 int i;	
Pointer m;
	
 O << a << endl;

         for (int i=0;i<=T.Length; i++)
                       m.pArray[i] = T.pArray[i];
                       O << m.pArray[i] << " ";

           O << endl;

          return O;  }
все работает, но когда пишу в main.cpp cout<<p2<<endl; тогда ругается...
blackbanny вне форума Ответить с цитированием
Старый 02.05.2010, 14:19   #6
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Код:
 int i;	
 for (int i=0;i<=T.Length; i++)
     m.pArray[i] = T.pArray[i];
 O << m.pArray[i] << " ";
тут разные i, при обращении m.pArray[i] переменная i не инициализирвоана.
замените на:
Код:
for (i=0;i<=T.Length; i++)
и еще:
Код:
friend ostream &operator << (ostream & , Pointer &);
//...
ostream operator << (ostream &O, Pointer &T) //не хватает &
{
//...
}
rrrFer вне форума Ответить с цитированием
Старый 02.05.2010, 14:31   #7
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
Код:
 int i;	
 for (int i=0;i<=T.Length; i++)
     m.pArray[i] = T.pArray[i];
 O << m.pArray[i] << " ";
тут разные i, при обращении m.pArray[i] переменная i не инициализирвоана.
замените на:
Код:
for (i=0;i<=T.Length; i++)
и еще:
Код:
friend ostream &operator << (ostream & , Pointer &);
//...
ostream operator << (ostream &O, Pointer &T) //не хватает &
{
//...
}
все равно не работает...
blackbanny вне форума Ответить с цитированием
Старый 02.05.2010, 15:00   #8
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

blackbanny
приведите код
Код:
#include <iostream>
using std::cout;
using std::ostream;
class Pointer{
public:
	friend ostream& operator << (ostream &O, Pointer &p);
};
ostream& operator << (ostream &O, Pointer &p){
    return O; 
}
int main(){
	Pointer p2;
	cout<<p2;
	return 0;
}
вот работает без ошибок
rrrFer вне форума Ответить с цитированием
Старый 02.05.2010, 16:00   #9
blackbanny
Форумчанин
 
Аватар для blackbanny
 
Регистрация: 02.10.2009
Сообщений: 104
По умолчанию

вот main.cpp:
Код:
#include "pointer.h"
#include<stdlib.h>
#include<iostream>


using namespace std;
int main()
{
	setlocale(LC_ALL,"Russian");
	Pointer p;
	int Array[2][4]={ {1,2,2,0},{3,4,4,0}};//массив
	int *pp[2]={Array[0],Array[1]};//указатель на него,тупо для теста
	int Array2[3][3]={ {100,12,0},{300,20,0},{10,30,0} };
	int* temp[3]={Array2[0],Array2[1],Array2[2]};
	Pointer p2(pp,2);
	Pointer p3(temp,3);
	cout<<"Матрица 1"<<endl;
	p2.Display();
	cout<<"Матрица 2"<<endl;
	p3.Display();
	p2.Mul(p3);
	cout<<"Произведение:"<<endl;
	p2.Display();

	Pointer p4(pp,2);
	Pointer p5(pp,2);
	cout<<"Матрица 1"<<endl;
	p4.Display();
	cout<<"Матрица 2"<<endl;
	p5.Display();
	cout<<"Сложение"<<endl;
	p4.Add(p5);	
	p4.Display();
 	system("pause");
};
вот pointer.h:
Код:
#pragma once
#include <iostream>
using namespace std;


class Pointer
{
public:
	Pointer();
	Pointer(int**,int size);//size-колво строк
	Pointer(Pointer&);
	~Pointer();
	void Display();
	int GetElement(int row,int pos);//вернуть элемент из строки row ,имеющий позтицию pos
	void SetElement(int row,int pos,int newelem);
    int RowLength(int *p);//длина строки p;*
	void Add(Pointer&);
    bool Compare(Pointer&);
	void Mul(Pointer&);
	Pointer operator +(Pointer &);
	Pointer operator *(Pointer &);
	Pointer& operator = (Pointer &);
	friend ostream &operator << (ostream & , Pointer &);





protected:
	int **pArray;
	int Length;
};
вот 1.cpp:
Код:
#include"pointer.h"
#include<iostream>
#include<stdio.h>


using namespace std;
Pointer::Pointer()
{
	pArray=new int*[1];
	*pArray=0;
	Length=1;
};
Pointer::Pointer(int **Array,int size)
{
	pArray=new int*[size];
	Length=0;
	for(int i=0;i<size;i++)
	{
		pArray[i]=Array[i];
		Length++;
	};
};
Pointer::~Pointer()
{
	
	delete pArray;
}; 
Pointer::Pointer(Pointer& p)
{
	Length=p.Length;
	pArray=new int*[Length];
	for(int i=0;i<Length;i++)
	{
		*(pArray+i)=*(p.pArray+i);
	};
};
void Pointer::Display()
{
	int *p;
	for(int i=0;i<Length;i++)
	{
		p=pArray[i];
		while(*pArray[i]!=0)
		{
			cout<<*pArray[i]<<" ";
			*pArray[i]++;
		};
		pArray[i]=p;
		cout<<endl;
	};
};

void Pointer::Add(Pointer & p)
{
	if(Length!=p.Length)return;
	for(int i=0;i<Length;i++)
	{
		if(RowLength(i)!=p.RowLength(i))return;
	};//складываются только одинаковые по размерам матрицы
	for(int i=0;i<Length;i++)
	{
		for(int j=0;j<RowLength(i);j++)
		{
			int a=GetElement(i,j)+p.GetElement(i,j);
			SetElement(i,j,a);
		};
	};
};
int Pointer::RowLength(int *p)
{
	int* q=p;
	int result=0;
	for(;*q!=0;q++,result++);
	return result+1;//включили завершающий 0
};

int Pointer::GetElement(int row, int pos)
{
	if(row>=Length)return 0;
	if(pos>=RowLength(row))return 0;
	return *(*(pArray+row)+pos);
};



void Pointer::SetElement(int row, int pos, int newelem)
{
	if(row>=Length)return ;
	if(pos>=RowLength(row))return ;
	*(*(pArray+row)+pos)=newelem;
};

bool Pointer::Compare(Pointer& p)
{
	
	if(Length!=p.Length)return false;//длины не равны-следовательно матрицы тоже
	int i;
	for(i=0;i<Length;i++)
	{//получаем новую строку
		
			int* tmp=pArray[i];
			int* tmp2=p.pArray[i];
			do
			{
				if(*tmp++!=*tmp2++)return false;
			}while(*tmp!=0);
			
			//сравниваем поэлементно строки
	};
	if(i==Length)return true;//если цикл ни разу не прервался-все элементы равны,возвращаем true
};
void Pointer::Mul(Pointer & p)
{

	for(int i=0;i<Length;i++)
	{
	
		if(RowLength(i)!=p.Length)return;
	};
	for(int i=0;i<p.Length;i++)
	{
		if(p.RowLength(i)!=Length)return;
	};
	int* Array=new int[Length+1];
	for(int i=0;i<Length;i++)Array[i]=0;
	for(int i=0;i<Length;i++)//взяли строку
	{
		for(int k=0;k<p.RowLength(i);k++)//взяли столбей второй матрицы
		{
			for(int j=0;j<RowLength(i);j++)//взяли элемент первой матрицы
			{
					Array[k]+=GetElement(i,j)*p.GetElement(j,k);

			};
		};
		Array[Length]=0;
		
		for(int i=0;i<Length;i++)Array[i]=0;
	};
	delete Array;
};

Pointer Pointer :: operator + (Pointer &p)
{
	Pointer* n = new Pointer[p.Length];
	n->Add(p);
	return *n;
};

Pointer Pointer :: operator * (Pointer &p)
{
	Pointer* n = new Pointer[p.Length];
	n->Mul(p);
	return *n;
};
Pointer& Pointer :: operator = (Pointer &p)
{
	int a = p.Length;
	int b = 0;
    Pointer m;
	for(int  i =0; i < a; i++)
	{  
		m.pArray[i] = p.pArray[i];
	}
    return m;
};

ostream operator << (ostream &O, Pointer &T)
{


 int i;	
Pointer m;
	


         for (i=0;i<=T.Length; i++)
                       m.pArray[i] = T.pArray[i];
                       O << m.pArray[i] << " ";

           O << endl;

          return O;  }

Последний раз редактировалось blackbanny; 02.05.2010 в 16:23.
blackbanny вне форума Ответить с цитированием
Старый 02.05.2010, 17:07   #10
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,618
По умолчанию

Цитата:
Цитата:
friend ostream &operator << (ostream & , Pointer &);
//...
ostream operator << (ostream &O, Pointer &T) //не хватает &
{
//...
}
все равно не работает...
Неработает, вы ничего не изменили - в 168 строчке 1.cpp как было
ostream operator << (ostream &O, Pointer &T) так и осталось.
Замените на:
Код:
ostream& operator << (ostream &O, Pointer &T)
rrrFer вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с протами ввода вывода Assemblerru Win Api 4 05.03.2010 20:53
Ошибки в функциях ввода-вывода (Си) spirit_trapper Помощь студентам 2 28.12.2009 12:54
Перенаправление ввода/вывода 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