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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.09.2010, 20:02   #1
zhenya.ya
Форумчанин
 
Регистрация: 29.11.2009
Сообщений: 142
Сообщение конструкторы

Код - класс "матрица".
Проблема: при данном выделении динам. памяти(выделение через malloc, а так необходимо по условию) ругается на метод print();
Преподаватель сказал, что должен быть конструктор копирования, без него не может работать. Может ошибка из-за его отсутствия? Как его тут пременить?

Код:
class matrix
{ 	
private:

	    int m,n,i,j;
        int **matrica;
public: 
	matrix();
	
        ~matrix(); 
        int get(int ,int);
        void print();
		void setSize();
};

 void matrix::setSize()
{
    int first;
    int second;
    cout<<"Enter first size: ";
    cin>>first;
    cout<<"Enter second size: ";
    cin>>second;
    n=first;
    m=second;
	system("cls");
 }
 
matrix::matrix()
{
	setSize();
int **matrica=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
	matrica[i]=(int*)malloc(m*sizeof(int));

        for ( i = 0; i < n; i++)
               for ( j = 0; j < m; j++)
                        matrica[i][j] = rand() % 10;
}


void matrix::print()
{
     for( i = 0; i < n; i++)
     {
         for(j = 0; j < m; j++)
               cout<<matrica[i][j]<<' ';
         cout<<"\n";
     }
}
 matrix::~matrix()
{
     for (i = 0; i < n; i++)
     free(matrica[i]);
free(matrica);
}
int matrix::get(int i,int j)
{
         if(i>=n||j>=m)
            return 0;
         cout<<matrica[i][j]<<'\n';
}
 
int main ()
{  
        system("cls");
        matrix object;
        object.print();
        int i, j;
        cout<<"\n get (i.j):"<<endl;
        cout<<"Enter i: ";
        cin>>i;
        cout<<"Enter j: ";
        cin>>j;
        if(object.get(i,j)==0)
           cout<<"i or j more or equal than n or m!\n";
        system("PAUSE");
        return 0;
}
zhenya.ya вне форума Ответить с цитированием
Старый 15.09.2010, 08:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Все дело в том что ты не учел видимость переменных.
Смотри, ты описал поле int **matrica; класса.
А в методе описал локальную переменку с тем же именем
Код:
int **matrica=(int**)malloc(n*sizeof(int*));
И с ней успешно работаешь.
Но она локальна и не будет видна за пределами метода, а ты думаешь что во всем классе идет работа именно с той областью которая заполнена случайными значениями, хотя эта область памяти превратилась в мусор без якоря.

Я не настолько знаю Си но могу посоветовать со своей колокольни заполнять локальную переменку с другим именем, а потом присваивать поле класса matrica значением с этой временной переменки:
Код:
matrix::matrix()
{
    setSize();
int **matrica2=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
    matrica2[i]=(int*)malloc(m*sizeof(int));

        for ( i = 0; i < n; i++)
               for ( j = 0; j < m; j++)
                        matrica2[i][j] = rand() % 10;
matrica=matrica2;
}
Тогда и яйца целы и овцы сыты.
И не нужно брать манер с горе-кодеров которые дают переменным особой важности одинаковые имена несмотря на разные пределы видимости.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.09.2010, 21:00   #3
zhenya.ya
Форумчанин
 
Регистрация: 29.11.2009
Сообщений: 142
По умолчанию

Воспользовался Вашей помошью. Вывод и др. методы выполняются, за что большое спасибо, но по завершению выполнения кидает ошибку и открывает dbgheap.c.
В чем проблема?
zhenya.ya вне форума Ответить с цитированием
Старый 16.09.2010, 09:34   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Проверил твой код на VS2010 все в порядке ничего не вылетает.
Разве что:
Код:
    matrix *object=new matrix();
        object->print();
        int i, j;
        cout<<"\n get (i.j):"<<endl;
        cout<<"Enter i: ";
        cin>>i;
        cout<<"Enter j: ";
        cin>>j;
        if(object->get(i,j)==0)
           cout<<"i or j more or equal than n or m!\n";
        system("PAUSE");
        delete object;
Ибо всетки работа идет с объектом
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Конструкторы и классы С++ Lioness Помощь студентам 12 06.11.2011 09:50
С++ и С# Конструкторы и Деструкторы exKenny Помощь студентам 1 27.04.2010 12:32
Конструкторы С++ Билдер prikolist Общие вопросы C/C++ 5 02.05.2009 17:40
Конструкторы и деконструкторы Элодар Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 11.02.2009 10:25
Конструкторы Лорд Общие вопросы C/C++ 1 21.12.2008 18:35