Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с указателями в классе 
:(
    Опции темы
MFSham
Дата 8.2.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: 1
Всего: 3



Работаю в консольном режиме.
Создаю класс в конструкторе у которого объявляю двумерный динамический массив(квадратная матрица). Там же его и заполняю. Т.к. массив динамический, то имеется и указатель на начало массива.
В классе есть процедурка вывода на экран.
Далее в 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;
}
//---------------------------------------------------------------------------



--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
chipset
Дата 8.2.2006, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



Я если честно не вижу проблемы с указателями. По-моему что-то неправильно с randomize smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
DeadSoul
Дата 8.2.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Partizan
Дата 8.2.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 67



убираешь оттуда рандомайз и всё будет ок smile


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
BreakPointMAN
Дата 8.2.2006, 01:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



Код

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

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


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
DeadSoul
Дата 8.2.2006, 01:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



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

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

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

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


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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
chipset
Дата 8.2.2006, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164



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

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

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

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


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
BreakPointMAN
Дата 8.2.2006, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



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

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

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

Это сообщение отредактировал(а) BreakPointMAN - 8.2.2006, 03:08


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
MFSham
Дата 8.2.2006, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: 1
Всего: 3



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


--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
MAKCim
Дата 8.2.2006, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

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

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

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



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
DeadSoul
Дата 8.2.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



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

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

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

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

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

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

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


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
MFSham
Дата 9.2.2006, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

Репутация: 1
Всего: 3



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

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

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

--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
DeadSoul
Дата 9.2.2006, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



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

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

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



--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
chipset
Дата 9.2.2006, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 164




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



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
mo3art
Дата 9.2.2006, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 29.9.2005
Где: пло не та 3 емля

Репутация: нет
Всего: нет



Цитата(MAKCim @ 8.2.2006, 08:39)
Цитата

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

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

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

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

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

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1122 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.