Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ф-ция вывода массива в классе


Автор: Voldemar2004 17.12.2006, 22:21
В лабе нужно реализовать класс "Разреженный массив", вот файл SparseArr.h:
Код
#include <list>

#include <string>

#include <sstream>

using namespace std;

//---------------------------------------------------------------------------

template <class DataT> class SA_item {

public:
        SA_item() : index(-1), info(DataT()) {}

        SA_item(long i, DataT d) : index(i), info(d) {}

        long index;

        DataT info;
};

//---------------------------------------------------------------------------

template <class T> class SparseArr {

public:

        SparseArr(long len) : length(len) {};

        T& operator [](long ind);

        string Show();

private:

std::list<SA_item<T> > arr;

long length;

};

//---------------------------------------------------------------------------

template <class T>
T& SparseArr<T>::operator[](long ind) {

if ( (ind < 0) || (ind > length - 1) ) {

SA_item<T> temp;
return temp.info;

}

list<SA_item<T> >::iterator i = arr.begin();
list<SA_item<T> >::iterator n = arr.end();

for (i; i != n; ++i)
        if (ind == i->index)
                return i->info;


arr.push_back(SA_item<T>(ind, T()));
i = arr.end();
return (--i)->info;

}

/* Метод Show - для вывода разреженного массива: */

template <class T>
string SparseArr<T>::Show() {

stringstream Buffer;

list<SA_item<T> >::iterator i = arr.begin();

list<SA_item<T> >::iterator n = arr.end();

for (i; i != n; ++i) Buffer << i->info << '\t';

return Buffer.str();

}


Проблема в том, что метод Show работает только для простых типов:
Код
void main(){
SparseArr<double> Numbers(2000000);

Numbers[0] = 1.1;
Numbers[38225]  =  1.2;
Numbers[2004056]  =  1.3;
Numbers[1999999]  =  1.4;
}


Если я применяю метод Show для типа Student, то вылазит ошибка: "Оператор << не применим к типу stringstream с аргументом типа Student". В чем ошибка? smile 

Код
class Student
{

public:

   char Shifr[100];           
   char Fam [100];              
   char Name [100];            
   char Otch [100];          
   char Ball[100];  

};

Автор: GIK 17.12.2006, 22:58
А где объект Numbers ?

Автор: Sartorius 17.12.2006, 23:00
 Перегружать потому что нада <<.

Автор: Voldemar2004 17.12.2006, 23:06
Цитата(Sartorius @  18.12.2006,  00:00 Найти цитируемый пост)
Перегружать потому что нада <<.
Этого я больше всего и боялся. Ладно буду перегружать. smile 

Автор: zkv 17.12.2006, 23:08
можно например так решить проблему, зависит от того что получить надо:
Код

class Student
{
public:
   char Shifr[100];           
   char Fam [100];              
   char Name [100];            
   char Otch [100];          
   char Ball[100];  
   operator char *()
   {           //здесь танец с бубном, чтобы на выходе что надо получить :)
        return Shifr;
   }
};

Автор: Voldemar2004 17.12.2006, 23:09
GIK, Numbers - это объект типа SparseArr - об этом говорит строка:
Код
SparseArr<double> Numbers(2000000);
<double> - спецификация шаблонного класса.

Автор: GIK 17.12.2006, 23:19
Цитата

GIK, Numbers - это объект типа SparseArr - об этом говорит строка:

Все, у меня едет крыша... пойду спать smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)