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

Тема в разделе "Общие вопросы по С и С++", создана пользователем __tired, 15 апр 2007.

Статус темы:
Закрыта.
  1. __tired

    __tired Гость

    Цель пограммы - реализовать класс очередь(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)
    Код (Text):
    #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)
    Код (Text):
    #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))
    Код (Text):
    #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;
    }
    }
    }
    }
     
  2. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    В конструкторе у тебя переменная объявлена - _mylist *_link; так что вся инициализация для нее идет, а не для члена класса с таким именем.
     
  3. __tired

    __tired Гость

    Thnx :)
    действительно стоило убрать из конструктора это объявление и инициализация правильно происходит..
     
Загрузка...
Похожие Темы - Вложенные классы есть
  1. slavon-x86
    Ответов:
    1
    Просмотров:
    3.029
  2. Marinka
    Ответов:
    2
    Просмотров:
    1.083
  3. morpheus
    Ответов:
    0
    Просмотров:
    3.350
  4. 203
    Ответов:
    11
    Просмотров:
    2.579
  5. vladis222
    Ответов:
    4
    Просмотров:
    1.650
Статус темы:
Закрыта.

Поделиться этой страницей