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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.04.2012, 11:44   #1
Gelor
Новичок
Джуниор
 
Регистрация: 09.04.2012
Сообщений: 1
По умолчанию Почему обнуляются члены класса?

Приветствую уважаемых участников форума!

Вот элементарная функция main():

Код:
#include "Cauchy_prob_cls.h"
#include <iostream.h>
#include <stdio.h>

int main()
{
	cauchy_prob cp;

	cout<<(*cp.y0).dim<<"\n";
	cout<<(*cp.y0).dim<<"\n";
	return 0;
}
Такая проблема: первой строчкой выводится 3, второй ноль.
Я совершенно без понятия, почему оно обнуляется после того как я к ней обращаюсь!

Вот классы:

Код:
#ifndef Cauchy_prob_cls.h
#define Cauchy_prob_cls.h

#include <iostream.h>
#include <stdio.h>
#include "CP_classes.h"

class cauchy_prob;

class cauchy_prob
{
public:

	cauchy_prob();
        int dim;
	vector *y0;

	void set_y0(vector v);	

	double f_1(double x, vector* y);
	double f_2(double x, vector* y);
	double f_3(double x, vector* y);
};

cauchy_prob::cauchy_prob()
{
	cauchy_prob::dim=3;
	cauchy_prob::y0=&vector(dim);
}

void cauchy_prob::set_y0(vector v)
{
	cout<<"Dim(v)="<<v.dim<<"\n";
	cout<<"Dim(y0)="<<(y0)->dim<<"\n";
	ass_b_to_a (*(cauchy_prob::y0), v);
}

double cauchy_prob::f_1 (double x, vector* y)
{
  
	return (x)*(y->val[0])*(y->val[1])*(y->val[2]);
}

double cauchy_prob::f_2(double x, vector* y)
{

	return (x)+y->val[0]+y->val[1]+y->val[2];
}

double cauchy_prob::f_3(double x, vector* y)
{
	return (-1)*(x)*y->val[0]*y->val[1]*y->val[2];
}
#endif
и два:

Код:
#ifndef CP_classes.h
#define CP_classes.h

#include <iostream.h>
#include <stdio.h>

class vector;

void ass_b_to_a (vector a, vector b);

class vector
{
public:
	vector(int n);
	int dim;
	double* val;

	void show (void);
	void print (FILE* f);
};

vector::vector(int n)
{
	vector::dim=n;
	vector::val=(double*)malloc(n*sizeof(double)); 

	for (int i=0; i<=n-1; i++)
	{
		vector::val[i]=0;
	}
}


void vector::show (void)
{
	cout<<"(";

	if (dim>=1)
	{
		cout<<val[0];
		for (int i=1; i<=dim-1; i++)
		{
			cout<<", "<<val[i];
		}
	}

	cout<<")\n";
}

void vector::print (FILE* f)
{
	fprintf(f, "(");

	if (dim>=1)
	{
		fprintf(f, "%f", val[0]);
		for (int i=1; i<=dim-1; i++)
		{
			fprintf(f, ", %f", val[i]);
		}
	}

	fprintf(f, ")\n");
}


void ass_b_to_a (vector a, vector b)
{
	if (a.dim!=b.dim)
	{
		cout<<"Dim(a)="<<a.dim<<" dim(b)="<<b.dim<<" - vectors' dimensions don't match.\n";
	}
	else
	{
		for (int i=0; i<=(a.dim)-1; i++)
		{
			a.val[i]=b.val[i];
		}
	
	}
}

#endif
Gelor вне форума Ответить с цитированием
Старый 09.04.2012, 14:47   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

В конструкторе cauchy_prob вы создаете vector и записываете его адрес, но он создается как временная переменная и сразу же удаляется. Что будет потом с памятью, где он был, знает только компилятор. Сделайте так:
Код:
cauchy_prob::cauchy_prob()
{
	dim=3;
	y0=new vector(dim);
}
писать cauchy_prob:: внутри функции класса совсем не обязательно. И вот это
Код:
val=(double*)malloc(n*sizeof(double));
Замените на
Код:
val=new double[n];
на с++ пишете, а не на си =)
Еще у vector нет деструктора, а он нужен, так как вы используете динамическую память:
Код:
vector::~vector()
{
        delete [] val;
}
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 11.04.2012, 21:34   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Что будет потом с памятью, где он был, знает только компилятор.
Скорее всего не знает... он вызвал деструктор, отдал память системе и все.
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Статические члены класса _-Re@l-_ Общие вопросы C/C++ 8 20.01.2011 23:18
Перезагрузка оператора и приватные члены класса. Gundos Общие вопросы C/C++ 4 17.01.2011 18:47
Почему из метода класса нельзя обратиться к компоненту на форме? Дима я Общие вопросы Delphi 2 28.03.2010 13:21
Скрыть члены класса от 'CodeGuide' в MVS 2005-08 Руслантус Общие вопросы C/C++ 2 26.12.2009 16:13