Перегрузка <<
От: RASH  
Дата: 24.10.10 16:32
Оценка:
Доброго времени суток всем! Возникла проблема:
Имеется класс:


class Matrix
{
    public: int **massive;    //указатель на двумерный массив
            unsigned SIZE_Y, SIZE_X;
            //Конструктор
            Matrix(unsigned sizex, unsigned sizey)
            //Размеры массива
            unsigned GetLength(int x)
            //Нулл Массива
            void zeros()
            //Вывод массива на экран
            friend ostream &operator<<(ostream &, Matrix );//<-соответственно проблема тут
            //Еденичная матрица
            void intity()
            //Деструктор
                        ~Matrix()
};

ostream &operator<<(ostream &output, Matrix t)
{
    for(unsigned i=0;i<t.GetLength(0);i++)
    {
        for(unsigned j=0;j<t.GetLength(1);j++)
            output<<" "<<t.massive[i][j];
        output<<endl;
    }
    return output;
};

int main()
{
        Matrix *Mass=new Matrix(5,5);
    Mass->intity();
    cout<<*Mass;//Первый массив выводится на экран нормально
    cout<<endl;//После этого вызывается деструктор 0_о
    Mass->zeros();//Соответственно не выполняется далее код
    cout<<*Mass<<endl;
    delete Mass;
    return 0;
}



Прошу помочь!
Re: Перегрузка <<
От: pokutan Израиль http://pokutan.com/
Дата: 24.10.10 16:35
Оценка: 3 (1) +1
Ты же вызываешь функцию — и передаешь в нее параметр по значению.
А надо бы выучить матчасть и передавать по ссылке.
Re: Перегрузка <<
От: LaptevVV Россия  
Дата: 24.10.10 16:40
Оценка: 3 (1)
Здравствуйте, RASH, Вы писали:

RAS>
RAS>class Matrix
RAS>{
RAS>            //Вывод массива на экран
RAS>            friend ostream &operator<<(ostream &, Matrix );//<-соответственно проблема тут
RAS>            //Деструктор
RAS>                        ~Matrix()
RAS>};

RAS>ostream &operator<<(ostream &output, Matrix t)
RAS>{
RAS>};
RAS>


Передавай матрицу по ссылке.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Перегрузка <<
От: RASH  
Дата: 24.10.10 16:40
Оценка:
Здравствуйте, pokutan, Вы писали:

P>Ты же вызываешь функцию — и передаешь в нее параметр по значению.

P>А надо бы выучить матчасть и передавать по ссылке.

Да, спасибо, помогло. Разобрался, модифицировал. Спасибо большое!
Re[2]: Перегрузка <<
От: wander  
Дата: 24.10.10 17:19
Оценка: 2 (2) +3
Здравствуйте, pokutan, Вы писали:

P>Ты же вызываешь функцию — и передаешь в нее параметр по значению.


Мне кажется проблема намного глубже. Ведь код не работал не потому что матрица передавалась по значению, а потом что у нее конструктор копирования по умолчанию. Копия исходной матрицы отработав в операторе вывода в поток уничтожалась, вызывался ее деструктор, который убивал массив int **massive;

Соответственно автору нужно реализовать нормальный оператор присваивания и конструктор копирования у класса матрица. Заюзать счетчик ссылок или другую технику для управления владением.
Re: intity?
От: igna Россия  
Дата: 27.10.10 04:09
Оценка:
Здравствуйте, RASH, Вы писали:

RAS>            void intity()


Что означает это слово, профессиональный жаргон для identity? Google его находит, а именно "Intity Clothing co." и "Intity New Media Design".
Re[3]: Перегрузка <<
От: sidorov18 США  
Дата: 27.10.10 06:38
Оценка:
Здравствуйте, wander, Вы писали:

W>Здравствуйте, pokutan, Вы писали:


P>>Ты же вызываешь функцию — и передаешь в нее параметр по значению.


W>Мне кажется проблема намного глубже. Ведь код не работал не потому что матрица передавалась по значению, а потом что у нее конструктор копирования по умолчанию. Копия исходной матрицы отработав в операторе вывода в поток уничтожалась, вызывался ее деструктор, который убивал массив int **massive;


W>Соответственно автору нужно реализовать нормальный оператор присваивания и конструктор копирования у класса матрица. Заюзать счетчик ссылок или другую технику для управления владением.


Или "на всякий случай" сделать приватный конструктор копирования и оператор присваивания — тогда ошибка будет на этапе компиляции.
А еще friend не нужен.
Re[2]: intity?
От: Lorenzo_LAMAS  
Дата: 27.10.10 12:26
Оценка:
I>Что означает это слово, профессиональный жаргон для identity? Google его находит, а именно "Intity Clothing co." и "Intity New Media Design".

звучит интригующе, так и хочется вызвать эту функцию!
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.