Вложенные классы. есть вопросы...

  • Автор темы __tired
  • Дата начала
Статус
Закрыто для дальнейших ответов.
T

__tired

#1
Цель пограммы - реализовать класс очередь(TQueue) с помощью двунаправленного кольцевого списка(класс tQueue::_mylist), реализованного в свою очередь динамически
Программа состоит из 3 файлов: модуля с реализацией функций класса TQueue, заголовочного файла, соответствующего этому классу, и собственно тестовой программы(main), которая должна использовать реализованные интерфейсные функции.
Возникла проблема: при объявлении и определении объета q(класса Tqueue) вызывается конструктор,
где создается объект вложенного класса _mylist(динамически создается), и далее этот объект инициализируется. То есть должно получаться, что q._link->size=0, но этого не происходит
с другой стороны при использовании отладчика в момент выполнения кода конструктора видно, что присвоение просиходит, то есть _link->size=0, но при обращении через всеобъемлющий объект (то есть через q ) получается что q._link->size!=0, зато q.size=0.
У меня большая просьба объясните в чем же всетаки дело. :huh:
...
(файл laba1_methods.h)
Код:
#ifndef laba1_methodsH
#include <vector.h>
#include <string.h>
#include <iostream.h>
#include <vcl.h>
#include <new.h>
//---------------------------------------------------------------------------
class tQueue
{
private:
class _mylist;
public:
_mylist *_link;
struct tElement;
tQueue();						 /
tQueue(const tQueue& q);		  //
~tQueue();						 //
int size;						 //
tElement& front();			 //
// 
tElement& back();				 //
// 
void push( tElement& e);		  //
void pop();						//
void clear();					 //

friend void Print(const tQueue& q);//
};
//-------------------------
struct tQueue::tElement
{
vector<double> f1;
short f2;
string f3;
};
//-------------------------
class tQueue::_mylist
{
public:
class listEl
{
public:
listEl *next;
listEl *prev;
tElement *ptr;
};
int size;
listEl *first;
};
//--------------------------
#define laba1_methodsH
#endif
...
(файл-модуль laba1_methods.cpp)
Код:
#include "laba1_methods.h"
//---------------------------------------------------------------------------
tQueue::tQueue()
{
_mylist *_link;
try	{
_link=new _mylist;
}
catch(bad_alloc xa)
{
cout << "Исключительная ситуация\n";
return;
}
size=0;
_link->size=0;
_link->first=0;
}
//---------------------------------
tQueue::tQueue(const tQueue &q)
{
_mylist::listEl *p,*p_q;
short int i;
tElement *e;
size=q.size;
for (i=1; i<=size; i++)
{
p_q=q._link->first;

try	{
p=new _mylist::listEl;
}
catch(bad_alloc xa)
{
cout << "Исключительная ситуация\n";
return;
}
if (i==1) {_link->first=p; p->prev=0; p->next=0;

try	{
e=new tElement;
}
catch(bad_alloc xa)
{
cout<<"Исключительная ситуация\n";
return;
}
p->ptr=e;
e->f1=(p_q->ptr)->f1;
e->f2=(p_q->ptr)->f2;
e->f3=(p_q->ptr)->f3;
} else
{
p->prev=(_link->first)->prev;
((_link->first)->prev)->next=p;
p->next=p;
(_link->first)->prev=p;
//-----------------------
try	{
e=new tElement;
}
catch(bad_alloc xa)
{
cout<<"Исключительная ситуация\n";
return;
}
p->ptr=e;
e->f1=(p_q->ptr)->f1;
e->f2=(p_q->ptr)->f2;
e->f3=(p_q->ptr)->f3;
}
p_q=p_q->next;
}
}
//----------------------------------
tQueue:: ~tQueue()
{
cout << "queue was destroyed"<<endl;
}
//-------------void tQueue::push(const tElement &e)------------------------
void tQueue::push( tElement &e)
{
_mylist::listEl *p;
if (!_link->size)
{
try	{
_link->first=new _mylist::listEl;
}
catch(bad_alloc xa) {
cout<<"Исключительная ситуация\n";
return;
}
_link->first->ptr=&e;
_link->first->next=_link->first;
_link->first->prev=_link->first;
size++;
_link->size++;
}
else
{
try	{
p=new _mylist::listEl;
}
catch(bad_alloc xa) {
cout<<"Исключительная ситуация\n";
return;
}
{
p->prev=_link->first->prev;
p->next=p;
(_link->first->prev)->next=p;
p->ptr=&e;
size++;
_link->size++;
}

}

}
//--------- tQueue& pop();-----------------------------
void tQueue::pop()
{
_mylist::listEl *p,*l;
if (_link->size>1)
{
l=_link->first;
p=_link->first->prev;
_link->first=_link->first->next;
_link->first->prev=p;
delete l->ptr;
delete l;
size--;
_link->size--;
}
if (_link->size==1)
{
delete _link->first->ptr;
delete _link->first;
size=0;
_link->size=0;
}
if (!_link->size)
cout << "queue is empty"<<endl;
}
// ------------ void clear(); ------------------------------
void tQueue::clear()
{
_mylist::listEl *p,*n;
int i;
if (_link->size)
{
p=_link->first;
for (i=1; i<=_link->size; i++){
n=p;
p=p->next;
delete n->ptr;
delete n;
}
size=0;
_link->size=0;
}	
}
//----------tElement& back();-------------------
tQueue::tElement& tQueue::back()
{
tElement *uk;
if (_link->size)
{
uk=(_link->first)->prev->ptr;
return *uk;
}
else {cout<<"queue is empty"<<endl;}
}
//-----------tElement& front();----------------------------------
tQueue::tElement& tQueue::front()
{
if (_link->size) return *(_link->first->ptr);
else {cout<<"queue is empty"<<endl;}
}
//-------------------friend void Print(const tQueue& q);------------------
void Print(const tQueue& q)
{
short int i;
double d;
int j=0;
int n=0;
tQueue::_mylist::listEl *p;
tQueue::tElement *e;
p=q._link->first;
for (i=1; i<=q.size; i++)
{
e=p->ptr;
{
cout << " i :" << endl;
//печать вектора
n=e->f1.size();
for (i=1; i<=n; i++)
{
d=e->f1.operator[](i);
cout << " " << d;
}
cout << endl;
//печать вектора
cout << e->f2 << endl;
cout << e->f3 << endl;
}
p=p->next;
}
}

...
(тестовая программа(main))
Код:
#include "laba1_methods.cpp"
//-------------------------------------------------
int main()
{
tQueue q;
tQueue::tElement *e;
int n;
int i;
short int _key;
double d;
short sh;
string st;
while (1) {
cout << "MENU" << endl;
cout << "Clear Push pOp pRint pErformance Quit" << endl;
cin >> _key;
switch (_key)
{
case 1:
{
q.clear();
break;
}
case 2:
{
try
{
e=new tQueue::tElement;
}
catch(bad_alloc xa)
{
cout << "Исключительная ситуация" << endl;
return 0;
}
//ввод элемента
cout << "enter vector size" << endl;
cin >> n;
for (i=1;  i<=n;	i++)
{
cin >> d;
e->f1.insert(&d, i+1);
}
cout << "enter int number" << endl;
cin >> sh;
cout << "enter string" << endl;
cin >> st;
e->f2=sh;
e->f3=st;
q.push(*e);
break;
}
case 3:
{
q.pop();
break;
}
case 4:
{
Print(q);
break;
}
case 5:
{
//эксперимент
break;
}
case 6:
{
return 0;
}
}
}
}
 

grigsoft

Well-known member
15.11.2005
735
0
#2
В конструкторе у тебя переменная объявлена - _mylist *_link; так что вся инициализация для нее идет, а не для члена класса с таким именем.
 
T

__tired

#3
Thnx :)
действительно стоило убрать из конструктора это объявление и инициализация правильно происходит..
 
Статус
Закрыто для дальнейших ответов.