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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.02.2010, 18:29   #1
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
Смущение массив указателей на структуры. С++. Перегрузка <<.Всю проблему не описать XD.

в общем всем бааальшой привет)))
Хочу приколоться, и сделал вот что:
Код:
struct sClient{
	char*call; 
	char*FIO;
	int fund;
	int index; //индекс следующего элемента (колизийного)

	friend ostream& operator<<(ostream& out, sClient &Node){
		out<<Node.call<<" "<<Node.FIO<<" "<<Node.fund<<endl;
		return out;

		}

};

void main(){
	sClient **array=new sClient*[N];
	array=enter(0);

	for (int i=0;i<N;i++)
		cout<<array[i];
}
выводит адрес ячейки а не задействует оператор << =(... ну почему так??=( =(
С наилучшими пожеланиями.
Познающий вне форума Ответить с цитированием
Старый 05.02.2010, 21:42   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Познающий Посмотреть сообщение
в общем всем бааальшой привет)))
Хочу приколоться, и сделал вот что:
Код:
struct sClient{
	char*call; 
	char*FIO;
	int fund;
	int index; //индекс следующего элемента (колизийного)

	friend ostream& operator<<(ostream& out, sClient &Node){
		out<<Node.call<<" "<<Node.FIO<<" "<<Node.fund<<endl;
		return out;

		}

};

void main(){
	sClient **array=new sClient*[N];
	array=enter(0);

	for (int i=0;i<N;i++)
		cout<<array[i];
}
выводит адрес ячейки а не задействует оператор << =(... ну почему так??=( =(
Ничего странного, вы ведь используете указатель на указатель.
Код:
for(int i = 0; i < N; i++)
    cout << *array[i];
netrino вне форума Ответить с цитированием
Старый 05.02.2010, 22:33   #3
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

и такое было...
Выдавал ошибку что << не определено для типа... а ну щас перепишу

вот. поставил звездочку:
Binary '<<' : no operator defined which takes a right-hand operand of type 'struct sClient' (or there is no acceptable conversion)

ЗЫ Визуал 6.0 )))
С наилучшими пожеланиями.
Познающий вне форума Ответить с цитированием
Старый 05.02.2010, 22:41   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

У меня работает, если звёздочку добавить
Остальной код тот же?
netrino вне форума Ответить с цитированием
Старый 05.02.2010, 22:49   #5
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

ну если брать остальной код...
Я просто переделывал со старого кода, мож чет в функции напутал. Но просто как-то нелогично придираться к функции - все работает видел в отладчике, только на консоль дает адрес
Код:
struct sClient{
	char*call; //позывной
	char*FIO;
	int fund;
	int index; //индекс следующего элемента (колизийного)

	friend ostream& operator<<(ostream& out, sClient &Node){
		out<<Node.call<<" "<<Node.FIO<<" "<<Node.fund<<endl;
		return out;

		}
};
sClient* create( char*call, char*FIO, int fund){ 
	sClient *ptmp = new sClient;
	int lenFIO(strlen(FIO)+1);
	int lenCall(strlen(call)+1);
	
	ptmp->FIO=new char[lenFIO];
	strcpy(ptmp->FIO,FIO);
	
	ptmp->call=new char[lenCall];
	strcpy(ptmp->call,call);

	ptmp->FIO[lenCall+1]='\0';
	ptmp->call[lenCall+1]='\0';

	ptmp->fund=fund;
	ptmp->index=0;
	return ptmp;
}


sClient** enter(int mode){ // пережитки прошлого
mode=0;
	if (mode==0){ 
	strcpy(message,"Режим ввода включен\n");
	::CharToOem(message,message);
	cout<<message;


	char*tFIO;
	char*tCall;
	int tfund;
	int i(0);
	sClient **pbegin=new sClient*[N];
	int P(0);

	strcpy(message,"Для остановки ввода, необходимо в поле фонд ввести отрицательное число\n");
	::CharToOem(message,message);
	cout<<message;

	strcpy(message,"Ф.И.О.\tПозывной\tФонд\n");
	::CharToOem(message,message);
	cout<<message;

	char*big_tmp;
	char*tmp1=new char [32];
	char*tmp2=new char [32];
	char*tmp3=new char [32];
	char*tmp4=new char [8];
		do{
		cin>>tmp1>>tmp2>>tmp3>>tmp4>>tfund;
		if(tfund>=0){
			big_tmp=new char[strlen(tmp1)+strlen(tmp2)+strlen(tmp3)];
			strcpy(big_tmp,tmp1);
			strcat(big_tmp," ");
			strcat(big_tmp,tmp2);
			strcat(big_tmp," ");
			strcat(big_tmp,tmp3);
			tFIO=new char [strlen(big_tmp)];
			strcpy(tFIO,big_tmp);
			tCall=new char[strlen(tmp1)+1];
			strcpy(tCall,tmp4);
			pbegin[i]=create(tCall,tFIO,tfund);
			i++;
		}
		}while (tfund>=0&&i<N);
		delete []tmp1;delete []tmp2;delete []tmp3;
		return pbegin;
	}
	return NULL;
}

void save(sClient**pbegin){
	char*file=new char[256];
	strcpy(message,"Введите имя файла для сохранения данных\n");
	::CharToOem(message,message);
	cout<<message;
	cin>>file;
	if(!file){
strcpy(message,"Файла не существует\n");
::CharToOem(message,message);
cout<<message;
}

ofstream out;
out.open(file,ios::binary);
if (!out) cout<<message;
int i(0);
	while (pbegin){
		out<<pbegin[i]->call<<" ";
		out<<pbegin[i]->FIO<<" ";
		out<<pbegin[i]->fund<<" ";
		out<<pbegin[i]->index;
			if (pbegin[i]) out<<"\n";
			i++;
	};
	delete [] file;
}


sClient** load(){
char* file=new char[256];

		strcpy(message,"Введите имя файла\n");
		::CharToOem(message,message);
		cout<<message;
		cin>>file;

ifstream in;
in.open(file,ios::binary);
char* ch_big_tmp=new char [255];
char* ch_mini_tmp=new char [32];
char* call=new char[10];
int tfund,i(0);

sClient**pbegin=new sClient*[15];

do{
in>>call;
in.ignore(1);
in>>ch_big_tmp;
strcat(ch_big_tmp," ");
in>>ch_mini_tmp;
strcat(ch_big_tmp,ch_mini_tmp);
strcat(ch_big_tmp," ");
in>>ch_mini_tmp;
strcat(ch_big_tmp,ch_mini_tmp); // это все ФИО
//в большой тмп по очереди заносим Ф потом И потом О
in>>tfund;


pbegin[i]=create(ch_mini_tmp,ch_big_tmp,tfund);


}while(in);

delete []ch_big_tmp;
delete []ch_mini_tmp;
delete [] file;
delete [] call;
return pbegin;
}
и мейн повторяться не буду)))

вот это все один большой сложный баг )))) тут явно надо дорабатывать но сам факт выделывания со стороны << меня удивляет)))
С наилучшими пожеланиями.
Познающий вне форума Ответить с цитированием
Старый 05.02.2010, 23:02   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не знаю какие проблемы у визуал це++ 6 с вашим кодом, у меня выводит так, как дóлжно. Попробуйте вынести описание оператора за пределы структуры:
Код:
struct sClient{
	char*call; //позывной
	char*FIO;
	int fund;
	int index; //индекс следующего элемента (колизийного)
};

ostream& operator<<(ostream& out, sClient &Node){
	out<<Node.call<<" "<<Node.FIO<<" "<<Node.fund<<endl;
	return out;

}
netrino вне форума Ответить с цитированием
Старый 06.02.2010, 00:24   #7
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

а вот и нет =)
Код:
error C2255: '<<' : a friend function can only be declared in a class
Как собственно и должно быть =) я не помню когда получалось дружественную функцию вне класса объявлять =(

Ладно фиг с ним напишу в цикле то что в операторе написал

эх все равно [] придется перегружать))))

не хочет выводить О_о ...
С наилучшими пожеланиями.

Последний раз редактировалось Познающий; 06.02.2010 в 00:34.
Познающий вне форума Ответить с цитированием
Старый 06.02.2010, 00:42   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А в приведённом мною примере видно, чтобы ф-ция была объявлена как friend? ) Странно, что не работает
netrino вне форума Ответить с цитированием
Старый 06.02.2010, 00:55   #9
Познающий
Форумчанин
 
Аватар для Познающий
 
Регистрация: 09.05.2009
Сообщений: 162
По умолчанию

точно... так оно и делалось..
С наилучшими пожеланиями.
Познающий вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив указателей RUSt88 Общие вопросы C/C++ 12 10.01.2010 11:11
массив указателей в С ++ серг Помощь студентам 1 14.12.2009 18:49
Массив указателей (паскаль) diliana Помощь студентам 19 14.11.2009 11:53
Массив указателей на структуры SNAKE89 Общие вопросы C/C++ 4 27.12.2007 10:14