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


Автор: MFSham 8.2.2006, 00:19
Работаю в консольном режиме.
Создаю класс в конструкторе у которого объявляю двумерный динамический массив(квадратная матрица). Там же его и заполняю. Т.к. массив динамический, то имеется и указатель на начало массива.
В классе есть процедурка вывода на экран.
Далее в main() пытаюсь сделать следующее: создаю 2 квадратные матрицы, вывожу их на экран. Все делается на описанных процедурах в классе.
Но, в результате выводится на экран две одинаковые матрицы. Я понимаю, что я неправильно работаю с указателями. Вроде до вызова процедуры Show() указатели различные, но после входа в нее они становятся одинаковыми. Подскажите где ошибка. Вот собственно исходник:
Код

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

#include <clx.h>
#include <iostream>
#include <conio>
#include <stdlib>
using namespace std;

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

class Matrix
{
public:
/* -------------   constructor   ---------------------  */
   Matrix(int count)
   {
      lenght=count;
      point = new double*[count];
        for (int i=0; i<count; i++)
          point[i] = new double[count];
      randomize();

      for (int i=0; i<count; i++)
         for (int j=0; j<count; j++)
         point[i][j]=random(10);
   };
/* -------------   destructor   ----------------------  */
   ~Matrix()  {   delete[] point;   }
/* -------------   output to screen ------------------  */
void  Show()
   {
           for (int i=0; i<lenght; i++)
           {
              for (int j=0; j<lenght; j++)
                cout << point[i][j] << " ";
              cout << '\n';
           }
   }

private:

   double **point;
   int lenght;
};

/* -------------   main()   --------------------------  */
int main()
{
   Matrix mas(7),mas2(7);

   mas.Show();
   cout << endl;

   cout <<"----------------------" << '\n';
   mas2.Show();

   getch();
   mas.~Matrix();
   mas2.~Matrix();

        return 0;
}
//---------------------------------------------------------------------------



Автор: chipset 8.2.2006, 01:27
Я если честно не вижу проблемы с указателями. По-моему что-то неправильно с randomize smile

Автор: DeadSoul 8.2.2006, 01:34
Цитата(chipset @ 8.2.2006, 01:27 Найти цитируемый пост)

По-моему что-то неправильно с randomize 

Скорее всего так. Замени следующую строку
Код

randomize();

на
Код

static bool firstInit=true;
if ( firstInit )
{
 firstInit=false;
 randomize();
}


Еще у тебя утечки памяти. У данных new
Код

for (int i=0; i<count; i++)
          point[i] = new double[count];

нету delete

Автор: Partizan 8.2.2006, 01:34
убираешь оттуда рандомайз и всё будет ок smile

Автор: BreakPointMAN 8.2.2006, 01:41
Код

   mas.~Matrix();
   mas2.~Matrix();

Порнография.

Автор: DeadSoul 8.2.2006, 01:49
Цитата(BreakPointMAN @ 8.2.2006, 01:41 Найти цитируемый пост)

Порнография.

Согласен. MFSham, при удаление объекта( у тебя оно происходит автоматически, т.к. объект создан на стеке ) деструктор вызывается автоматически. "Руками" его вызывать не надо
Добавлено @ 01:51
насчет randomize-а:
Убери его отуда где он написан и
Код

int main()
{
// ВПИШИ ЕГО СЮДА
   Matrix mas(7),mas2(7);


Мой вариант будет работать, но преподаватель не поверит, что ты это сам сделал

Автор: chipset 8.2.2006, 02:09
Цитата(DeadSoul @ 7.2.2006, 15:34 Найти цитируемый пост)

Скорее всего так. Замени следующую строку

Кстати это не очень красиво.

Надо инициализировать генератор случайных чисел чем-то вроде текущего значения таймера.

Автор: BreakPointMAN 8.2.2006, 03:03
Цитата(chipset @ 8.2.2006, 02:09 Найти цитируемый пост)

Кстати это не очень красиво.
Надо инициализировать генератор случайных чисел чем-то вроде текущего значения таймера.

randomize(); в начало программы и о'кей. Я более чем уверен, что в этой функции используются показания системного таймера при инициализации генератора случайных чисел.

Автор: MFSham 8.2.2006, 03:51
Большое спасибо ВСЕМ. А то я ломал голову с указателями.
Цитата(DeadSoul @ 8.2.2006, 01:49 Найти цитируемый пост)
при удаление объекта( у тебя оно происходит автоматически, т.к. объект создан на стеке ) деструктор вызывается автоматически. "Руками" его вызывать не надо
Это мы знаемс. Просто практиковался над объектом и смотрел что там находится после деструктора smile . Только вот скопил по ошибке.
Цитата(DeadSoul @ 8.2.2006, 01:49 Найти цитируемый пост)
Мой вариант будет работать, но преподаватель не поверит, что ты это сам сделал
Это почему? И при чем тут препод?


Автор: MAKCim 8.2.2006, 08:39
Цитата

при удаление объекта( у тебя оно происходит автоматически, т.к. объект создан на стеке ) деструктор вызывается автоматически. "Руками" его вызывать не надо

кроме случая
Код

T* pointer=new(address) T();
...
pointer->~T();

Автор: DeadSoul 8.2.2006, 22:49
Цитата(chipset @ 8.2.2006, 02:09 Найти цитируемый пост)

Надо инициализировать генератор случайных чисел чем-то вроде текущего значения таймера.

Как видишь у randomize() не параметров. Передать туда нечего. Лично я использую srand( текущее время с точностью до милисекунды преобразованное в int )

Цитата(MFSham @ 8.2.2006, 03:51 Найти цитируемый пост)

Цитата(DeadSoul @ 8.2.2006, 01:49 )
Мой вариант будет работать, но преподаватель не поверит, что ты это сам сделал
Это почему? И при чем тут препод?

Ты сможешь описать для чего применяется слово static? Просто вопрос был крайне похож на лабу очередного студента smile

MAKCim, и сколько раз ты делал такое в реальных проектах?

Автор: MFSham 9.2.2006, 00:01
Цитата(DeadSoul @ 8.2.2006, 22:49 Найти цитируемый пост)

Ты сможешь описать для чего применяется слово static? Просто вопрос был крайне похож на лабу очередного студента

Да, я знаю что означает слово static smile

Автор: DeadSoul 9.2.2006, 00:42
Цитата(MFSham @ 9.2.2006, 00:01 Найти цитируемый пост)

Цитата(DeadSoul @ 8.2.2006, 22:49 )
Ты сможешь описать для чего применяется слово static? Просто вопрос был крайне похож на лабу очередного студента
Да, я знаю что означает слово static 

Поехали. Для чего применяется слово ключевое слово static в С++

Автор: chipset 9.2.2006, 00:55

M
chipset
Не оффтопим.

Автор: mo3art 9.2.2006, 10:54
Цитата(MAKCim @ 8.2.2006, 08:39)
Цитата

при удаление объекта( у тебя оно происходит автоматически, т.к. объект создан на стеке ) деструктор вызывается автоматически. "Руками" его вызывать не надо

кроме случая
Код

T* pointer=new(address) T();
...
pointer->~T();

в этом случае у тебя будет утечка памяти....
при использовании оператора delete, который чистит память, деструктор вызовется автоматически.

ЗЫ - механизм с конструктором/деструктором был вложен в средства языка как раз для того, чтобы инициализация и разрушение объектов происходили ВСЕГДА АВТОМАТИЧЕСКИ.

Автор: Daevaorn 9.2.2006, 11:50
Цитата(mo3art @ 9.2.2006, 10:54 Найти цитируемый пост)

в этом случае у тебя будет утечка памяти....

Ты не прав. Это же placement new. Тут надо явно вызывать деструктор, а потом operator delete(pointer);

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