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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2010, 19:04   #1
lola20
Новичок
Джуниор
 
Регистрация: 23.12.2010
Сообщений: 4
По умолчанию проблема с классами

есть такая программа:
Код:
#pragma once

#include "global.h"

class CNode
{
public:
	CNode(void);
	~CNode(void);
	// координаты x и y
	double x;
	double y;
	// номер узла
	unsigned int number;
	// указатель на массив степеней свободы узла
	bool* st_sv;
	CNode(double _x, double _y, unsigned int _n, bool* _ss);
	CNode(const CNode& _n);
};
#include "node.h"

CNode::CNode(void)
: x(0)
, y(0)
, number(0)
, st_sv(NULL)
{
}

CNode::~CNode(void)
{
}

CNode::CNode(double _x, double _y, unsigned int _n, bool* _ss)
: x(_x)
, y(_y)
, number(_n)
, st_sv(_ss)
{
}

CNode::CNode(const CNode& _n)
: x(_n.x)
, y(_n.y)
, number(_n.number)
, st_sv(_n.st_sv)
{
}
#pragma once

class CFizgeo
{
public:
	CFizgeo(void);
	~CFizgeo(void);
	double e;
	double a;
	double i;
	double nu;
	double gamma;
	unsigned int number;
	CFizgeo(double _e, double _a, double _i, double _nu, double _g, unsigned int _num);
};
#include "fizgeo.h"

CFizgeo::CFizgeo(void)
: e(0)
, a(0)
, i(0)
, nu(0)
, gamma(0)
, number(0)
{
}

CFizgeo::~CFizgeo(void)
{
}

CFizgeo::CFizgeo(double _e, double _a, double _i, double _nu, double _g, unsigned int _num)
: e(_e)
, a(_a)
, i(_i)
, nu(_nu)
, gamma(_g)
, number(_num)
{
}
#pragma once
#include "node.h"
#include "fizgeo.h"

class CBasefelem
{
public:
	CBasefelem(void);
	virtual ~CBasefelem(void);
	CNode* n1;
	CNode* n2;
	CFizgeo* fizgeo;
	unsigned int number;
	CBasefelem(CNode _n1, CNode _n2, CFizgeo _fg, unsigned int _num);
};
#include "basefelem.h"

CBasefelem::CBasefelem(void)
: n1(NULL)
, n2(NULL)
, fizgeo(NULL)
, number(0)
{
}

CBasefelem::~CBasefelem(void)
{
}

CBasefelem::CBasefelem(CNode _n1, CNode _n2, CFizgeo _fg, unsigned int _num)
: n1(&_n1)
, n2(&_n2)
, fizgeo(&_fg)
, number(_num)
{
}
#pragma once

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

using namespace std;
#include "basefelem.h"

int main(int argc, char* arg[])
{
	bool st[] = {0, 1, 0};
	CNode n1(5, 10, 120, st), n2(n1);
	n2.number = 130;
	CFizgeo fg(21000, 1502, 12121, 0.23, 1.9, 1778);
	CBasefelem l(n1, n2, fg, 111);
	getchar();
	return 0;
}
и до строчки гетчар она работает нормально, а вот потом в переменную класса l записывает муссор в почти все значения(((
подскажите, что у делаю не так

заранее спасибо
lola20 вне форума Ответить с цитированием
Старый 23.12.2010, 19:12   #2
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

может после выполнения getchar срабатывают деструкторы? поставь точку останова в деструкторе посмори прыгнет ли туда
UltimaBeaR вне форума Ответить с цитированием
Старый 23.12.2010, 19:24   #3
lola20
Новичок
Джуниор
 
Регистрация: 23.12.2010
Сообщений: 4
По умолчанию

вызывается, но мусором переменные захламляются раньше(((
и никак не могу понять почему(
lola20 вне форума Ответить с цитированием
Старый 23.12.2010, 19:53   #4
X-Zef
 
Аватар для X-Zef
 
Регистрация: 29.11.2010
Сообщений: 7
По умолчанию

Перегрузка конструкторов не совсем верно организованно

Здесь: Зачем?
CNode::CNode(const CNode& _n)
: x(_n.x)
, y(_n.y)
, number(_n.number)
, st_sv(_n.st_sv)
{
}

код явно стырили.
X-Zef вне форума Ответить с цитированием
Старый 23.12.2010, 20:00   #5
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Откомпелил ваш (пост выше говорит что не ваш) код, l на самом деле остается там все значения такие а вот у остальыне классы как раз там вызывается деструктор .. почему хз.. может компилер решил удалить их пораньше потому как дальше по тексту не идет их использования?
ЗЫ: да нет что то тут не то)

деструктор вызвался из CBasefelem::CBasefelem .. причем обратите внимание в конструкторе передается параметр по значению а присваивается в мембер по ссылке.. после отработки конструктора переменная из параметров уничтожается(так как в стеке) отсюда видат ьи деструктор

Последний раз редактировалось UltimaBeaR; 23.12.2010 в 20:06.
UltimaBeaR вне форума Ответить с цитированием
Старый 23.12.2010, 20:10   #6
lola20
Новичок
Джуниор
 
Регистрация: 23.12.2010
Сообщений: 4
По умолчанию

ммм, код мой, перегрузка конструктора потому, что с указателями работаю.
присваивается по ссылке потому, что присваивается указателю, разве это не верно?
lola20 вне форума Ответить с цитированием
Старый 23.12.2010, 20:13   #7
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Да. Ты передаешь конструктору CBasefelem параметры по значению. При этом компилятор создает в стеке их копию, и после вызова конструктора эту копию уничтожает. И поля-указатели в классе показывают теперь туда, где ничего уже нет )
Son Of Pain вне форума Ответить с цитированием
Старый 23.12.2010, 20:18   #8
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

передавай по ссылке, а в конструкторе выделяй память под экземпляр и копируй туда переданный.. или если хочешь без указателя то поидее в инициализационной части просто передаешь эту же ссылку... это если ты хочешь чтобы была копия внутри.. если просто указатель нужен, то тожесамое все тока без выделения памяти
ЗЫ: если не врубился про стек и удаление.. то запомни вот чего:
Код:
void func(int param, int *param2)
{
    int local;

    {
       int local2;
       // тут происходит неявное удаление local2
    }

    // тут происходит неявное удаление local, param, param2(удаляется только указатель, но память остается)
}

Последний раз редактировалось UltimaBeaR; 23.12.2010 в 20:23.
UltimaBeaR вне форума Ответить с цитированием
Старый 23.12.2010, 20:42   #9
lola20
Новичок
Джуниор
 
Регистрация: 23.12.2010
Сообщений: 4
По умолчанию

я про все врубился))
просто я исправил уже спасибо
ошибка была в том что надо было так
Код:
CBasefelem::CBasefelem(CNode &_n1, CNode &_n2, CFizgeo &_fg, unsigned int _num)
: n1(&_n1)
, n2(&_n2)
, fizgeo(&_fg)
, number(_num)
{
}
lola20 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с классами sazonoff.13 Помощь студентам 1 07.10.2010 10:45
C# ошибка с классами nuevegramodelamor Помощь студентам 0 04.10.2010 12:45
Работа с классами Superlotles Общие вопросы C/C++ 6 16.06.2010 17:15
проблемма с классами ciaonataha Общие вопросы C/C++ 1 24.07.2009 18:04
Вопрос с классами. Вадим Буренков Общие вопросы Delphi 11 13.07.2009 10:57