פורסם 2006 במאי 1519 שנים ישנה בעיה קטנה//Copy constructorClient::Client(const Client &cl){ _name=new char[sizeof(cl._name)+1]; strcpy(_name, cl._name); _kit=cl._kit; next=NULL;}//DestructorClient::~Client(){// delete _name; //not working!!!}אם אני מוריד את "//" בהורס התוכנה לא מורצת, הרי העתקתי את השם בבנאי, מה הבעיה בקוד, האם הבנאי לא תקין?תודה מראש
פורסם 2006 במאי 1519 שנים תנסהdelete [] _name;כשמוחקים מערך צריך להשתמש ב-[] ריק, אחרת הקומפיילר חושב שאתה מוחק משתנה בודד.
פורסם 2006 במאי 1519 שנים מחבר תודה, עוד שאלה בהמשך הנושא, הוספתי פונ' לצורך בדיקהClient f(Client &cl){ return cl;}משומה, כאשר אני בודק, היא מחזירה את cl בלי השם שלו, ז''א שהקונסטרוקטור לא מעתיק את השם? למה זה קורא?
פורסם 2006 במאי 1519 שנים ישנה בעיה קטנה//Copy constructorClient::Client(const Client &cl){ _name=new char[sizeof(cl._name)+1]; strcpy(_name, cl._name); _kit=cl._kit; next=NULL;}//DestructorClient::~Client(){// delete _name; //not working!!!}אם אני מוריד את "//" בהורס התוכנה לא מורצת, הרי העתקתי את השם בבנאי, מה הבעיה בקוד, האם הבנאי לא תקין?תודה מראשאתה רוצה (strlen(cl._name ולא sizeof (בתוך ה-new).אל תשכח לכתוב assignment operator או לחילופין לבטל אותו.
פורסם 2006 במאי 1519 שנים מחבר אוקי תודה, (איך לא שמתי לב לזה). מה זה assignment operator ?הבעיה עדיין נשארה, פונ' מחזירה את cl עם שדה _name ריק.זה מה שיש לי עכשיו:const int clientName=20; //Name of workerclass 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;};//Default constructorClient::Client(){ _name=new char[7]; strcpy(_name, "NoName"); next=NULL; _kit=NULL;}//Constructor build 'Client' with given nameClient::Client(const char *name){ _name=new char[strlen(name)+1]; strcpy(_name, name); next=NULL; _kit=NULL;}//Copy constructorClient::Client(const Client &cl){ _name=new char[strlen(cl._name)+1]; strcpy(_name, cl._name); _kit=cl._kit; next=NULL;}//DestructorClient::~Client(){ delete [] _name; //not working!!!}//Returns name of workerchar *Client::getName()const{ return _name;}//Returns true only if worker has a kitbool Client::hasKit()const{ if(_kit!=NULL) return 1; return 0;}//Returns number of worker's kitint Client::kitNumber()const{ if(hasKit()) return (_kit->getNumber()); std::cout << "\nClient have not a kit\n"; return -999;}//Giving 'kit' to workervoid Client::receiveKit(Product kit){ _kit=new Product(kit);}Client* Client::getNext()const{ return next;}void Client::setNext(Client &cl){ next=&cl;}void Client::setNextNull(){ next=NULL;}//Prints to screen worker's namevoid Client::toString(){ std::cout << "Worker's name is " << _name; if(hasKit()) std::cout << "\nAnd his kit's ID is " << _kit->getNumber(); else std::cout << "\nThis worker doesn't have a kit.";}Client f(Client &cl){ return cl;}int main(){ Client c1("aa"); f(c1); cout << endl; return 0;}
פורסם 2006 במאי 1519 שנים מחבר אוקי. אנסה לפרט את הבעיה.אני בונה טור של Clients (רשימה מקושרת) ומחזיק אותו ע''י מצביע, ברגע שאני מנסה להוציא אחד ה-Clients מהטור ע''י Client ClientQueue::deQueue(){ if(head==tail) //If there is only one Client in queue { return *head; }}(מקרה שנשאר לי רק אחד)מוחזר ה-Client אבל השם שלו מתאפסמה הצורה הנכונה להוציא אחד ה-Clients מהטור, האם תוכל לתת דוגמה?כנראה ישנה איזו שהי תעות של אי הבנת החומר
פורסם 2006 במאי 1619 שנים תעשה דיבאג ותבדוק באיזו שורה השם מתאפס.ד.א בקופי קונסטרקטור - אתה לא יוצר קיט חדש, אלא משתמש בישן. תיצור קיט חדש(ע"י שימוש בקופי קונסטרקטור של product).
פורסם 2006 במאי 1619 שנים מחבר שיניתי טיפה את הבנאי, כך התכוונתה?//Copy constructorClient::Client(const Client &cl){ _name=new char[strlen(cl._name)+1]; strcpy(_name, cl._name);// _kit=cl._kit; //old _kit=new Product(cl.kitNumber()); next=NULL; std::cout << "CallCopyConstr" << std::endl;}עכשיו: השם נעלם ברגע יציאה מה -deQueueכאילו לא בניתי את הבנאי בצורה הנכונה, כאילו הוא לא מעתיק את כל האובייקט.
פורסם 2006 במאי 1819 שנים אני הייתי ממליץ לך להחזיר מצביע לאיבר, כדי שתוכל לעשות לו DELETE במקרה הצורך:Client *ClientQueue::deQueue(){ if(head==tail) //If there is only one Client in queue { return head; }}השימוש יהייה:delete q.deQueue();אוClient *c;c = q.deQueue();cout<<c.getName();delete c;
פורסם 2006 במאי 1919 שנים זהירות!אם אתה מחזיר מצביע תוודא שאתה ךא מבצע delete-ים בתוך הרשימה עצמה.באופן כללי כשעובדים עם מצביעים צריך תמיד לקבוע מי אחראי להם. כמו כן צפה באגים.
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.