Функ. возвращает обьект без имени
От: Pumych  
Дата: 17.05.06 09:48
Оценка:
Здраствуйте, имеется цледующая проблема:
создан связанный цписок из Clients
при возврате из функции deQueue() теряется имя у Client
на сколько мне известно это происходит когда конструктор не переписывает имя, подскажите пожалуста в чем моя ошибка.
В данном примере для упрощения я проверяю случай когда в очереди имеется только один клиент


class Client
{
public:
    Client();
    Client(const char *name);
    Client(const Client &cl);
    ~Client(){};
    char *getName()const;
    bool hasKit()const;
    int kitNumber()const;
    void receiveKit(Product kit);
    Client *getNext()const; 
    void setNext(Client &cl);
    void setNextNull();
    void toString();
private:
    char *_name;
    Client *next;
    Product *_kit;
};

//Copy constructor
Client::Client(const Client &cl)
{
    _name=new char[strlen(cl._name)+1];
    strcpy(_name, cl._name);
    if(cl.hasKit())      //Checks if there is some kit in Client
        _kit=new Product(cl.kitNumber());
    else
        _kit=NULL;
    next=NULL;
}

//Destructor
Client::~Client()
{
    delete [] _name;
    _name=NULL;
    delete _kit;
    _kit=NULL;
}

class ClientQueue
{
public:
    ClientQueue();
    ~ClientQueue();
    bool addToLine(Client &cl);
    Client deQueue();
    int size()const;
    bool isEmpty()const;
private:
    Client *head;    //Head of queue
    Client *tail;    //Tail of queue
};

//Default constructor
ClientQueue::ClientQueue()
{
    head=NULL;
    tail=NULL;
}

//Reurns Client from queue
Client ClientQueue::deQueue()
{
        if(head==tail)    //If there is only one Client in queue
    {
        return *head;
    }
}



int main()
{
   Client c1;        //Create object of Client
   ClientQueue q;    //Create object of ClientQueue
   q.addToLine(c1);  //Adding client to queue
   q.deQueue();      //Get Client from queue
   //Когда проверяю через дебагер, возвращается клиент без имени
   return 0;
}
Re: Функ. возвращает обьект без имени
От: saddva  
Дата: 17.05.06 10:06
Оценка:
Здравствуйте, Pumych, Вы писали:

[...]

А что у вас в ClientQueue::addToLine происходит? Может, не получается такого, что в ClientQueue::deQueue верно условие (head == tail).
Re[2]: Функ. возвращает обьект без имени
От: Pumych  
Дата: 17.05.06 11:01
Оценка:
Здравствуйте, saddva, Вы писали:

S>Здравствуйте, Pumych, Вы писали:


S>[...]


S>А что у вас в ClientQueue::addToLine происходит? Может, не получается такого, что в ClientQueue::deQueue верно условие (head == tail).



//Add Client to queue
bool ClientQueue::addToLine(Client &cl)
{
    if(tail==NULL)
    {
        head=tail=&cl;
    }
    else
    {
        tail->setNext(cl);

        tail=tail->getNext();
    }
    return 1;
}
Re[3]: Функ. возвращает обьект без имени
От: saddva  
Дата: 17.05.06 11:49
Оценка:
Здравствуйте, Pumych, Вы писали:

[...]

У вас создаётся объект с вызовом конструктора умолчания:
Client c1;

Этот конструктор действительно что-то записывает в поле _name? Т.е. примерно так выглядит?
Client(const char* name = "default name")
: next(NULL),
  _kit(NULL),
  _name(new char[strlen(name) + 1])
{        
    strcpy(_name, name);
}
Re[4]: Функ. возвращает обьект без имени
От: Аноним  
Дата: 17.05.06 11:56
Оценка:
вот конструктор по умолчанию, всё работает как надо до того момента пока не вышло из deQueue


//Default constructor
Client::Client()
{
    _name=new char[7];
    strcpy(_name, "NoName");
    next=NULL;
    _kit=NULL;
}
Re: Функ. возвращает обьект без имени
От: Centaur Россия  
Дата: 17.05.06 12:04
Оценка:
Здравствуйте, Pumych, Вы писали:

P>Здраствуйте, имеется цледующая проблема:

P>создан связанный цписок из Clients
P>при возврате из функции deQueue() теряется имя у Client
P>на сколько мне известно это происходит когда конструктор не переписывает имя, подскажите пожалуста в чем моя ошибка.
P>В данном примере для упрощения я проверяю случай когда в очереди имеется только один клиент

P>class Client
P>{
P>public:
P>    Client();
P>    Client(const char *name);
P>    Client(const Client &cl);
P>    ~Client(){};
P>    char *getName()const;
P>    bool hasKit()const;
P>    int kitNumber()const;
P>    void receiveKit(Product kit);
P>    Client *getNext()const; 
P>    void setNext(Client &cl);
P>    void setNextNull();
P>    void toString();
P>private:
P>    char *_name;
P>    Client *next;
P>    Product *_kit;
P>};


Здесь нарушен закон of the Big Three. «Если классу приходится определять отличный от умолчательного деструктор, копирующий конструктор или оператор присваивания, то обычно ему нужны все три.» А тут деструктор есть, копирующий конструктор есть, а оператор присваивания используется автоматически сгенерированный. Может быть, дело не в этом, но это тем не менее подозрительно.
Re[5]: Функ. возвращает обьект без имени
От: saddva  
Дата: 17.05.06 12:18
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

[...]

У меня вроде ваш же код:
Client c1("abcdefg");        //Create object of Client
ClientQueue q;    //Create object of ClientQueue
q.addToLine(c1);  //Adding client to queue
printf("%s", q.deQueue().getName());

пишет на экран, как полагается, строку abcdefg.
Re[6]: Функ. возвращает обьект без имени
От: Аноним  
Дата: 17.05.06 16:17
Оценка:
Ок спасибо, нашёл причину недоразумения. Оказывается саму проблему я устранил сам того не зная т.к. оказывается дебагер не показывает то что я думал. Если написать в дебагере
queue.deQueue();


то имя и в правду не видно (хотелось бы знать почему это) в этом и было недоразумение, спасибо всем за помощь, пошёл раздавать оценки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.