עבור לתוכן

Constructors & Destructors - cpp

Featured Replies

פורסם

ישנה בעיה קטנה

//Copy constructor
Client::Client(const Client &cl)
{
_name=new char[sizeof(cl._name)+1];
strcpy(_name, cl._name);
_kit=cl._kit;
next=NULL;
}

//Destructor
Client::~Client()
{
// delete _name; //not working!!!
}

אם אני מוריד את "//" בהורס התוכנה לא מורצת, הרי העתקתי את השם בבנאי, מה הבעיה בקוד, האם הבנאי לא תקין?

תודה מראש

פורסם

תנסה

delete [] _name;

כשמוחקים מערך צריך להשתמש ב-[] ריק, אחרת הקומפיילר חושב שאתה מוחק משתנה בודד.

פורסם
  • מחבר

נמחק

פורסם
  • מחבר

תודה, עוד שאלה בהמשך הנושא, הוספתי פונ' לצורך בדיקה


Client f(Client &cl)
{
return cl;
}

משומה, כאשר אני בודק, היא מחזירה את cl בלי השם שלו, ז''א שהקונסטרוקטור לא מעתיק את השם? למה זה קורא?

פורסם

ישנה בעיה קטנה

//Copy constructor
Client::Client(const Client &cl)
{
_name=new char[sizeof(cl._name)+1];
strcpy(_name, cl._name);
_kit=cl._kit;
next=NULL;
}

//Destructor
Client::~Client()
{
// delete _name; //not working!!!
}

אם אני מוריד את "//" בהורס התוכנה לא מורצת, הרי העתקתי את השם בבנאי, מה הבעיה בקוד, האם הבנאי לא תקין?

תודה מראש

אתה רוצה (strlen(cl._name ולא sizeof (בתוך ה-new).

אל תשכח לכתוב assignment operator או לחילופין לבטל אותו.

פורסם
  • מחבר

אוקי תודה, (איך לא שמתי לב לזה).

מה זה assignment operator ?

הבעיה עדיין נשארה, פונ' מחזירה את cl עם שדה _name ריק.

זה מה שיש לי עכשיו:


const int clientName=20; //Name of worker

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;
};


//Default constructor
Client::Client()
{
_name=new char[7];
strcpy(_name, "NoName");
next=NULL;
_kit=NULL;
}

//Constructor build 'Client' with given name
Client::Client(const char *name)
{
_name=new char[strlen(name)+1];
strcpy(_name, name);
next=NULL;
_kit=NULL;
}

//Copy constructor
Client::Client(const Client &cl)
{
_name=new char[strlen(cl._name)+1];
strcpy(_name, cl._name);
_kit=cl._kit;
next=NULL;
}

//Destructor
Client::~Client()
{
delete [] _name; //not working!!!
}

//Returns name of worker
char *Client::getName()const
{
return _name;
}

//Returns true only if worker has a kit
bool Client::hasKit()const
{
if(_kit!=NULL)
return 1;
return 0;
}

//Returns number of worker's kit
int Client::kitNumber()const
{
if(hasKit())
return (_kit->getNumber());
std::cout << "\nClient have not a kit\n";
return -999;
}

//Giving 'kit' to worker
void 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 name
void 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;
}

פורסם

תחזיר גם רפרנס.

פורסם
  • מחבר

אוקי. אנסה לפרט את הבעיה.

אני בונה טור של Clients (רשימה מקושרת) ומחזיק אותו ע''י מצביע, ברגע שאני מנסה להוציא אחד ה-Clients מהטור ע''י


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

(מקרה שנשאר לי רק אחד)

מוחזר ה-Client אבל השם שלו מתאפס

מה הצורה הנכונה להוציא אחד ה-Clients מהטור, האם תוכל לתת דוגמה?

כנראה ישנה איזו שהי תעות של אי הבנת החומר

פורסם

תעשה דיבאג ותבדוק באיזו שורה השם מתאפס.

ד.א בקופי קונסטרקטור - אתה לא יוצר קיט חדש, אלא משתמש בישן. תיצור קיט חדש(ע"י שימוש בקופי קונסטרקטור של product).

פורסם
  • מחבר

שיניתי טיפה את הבנאי, כך התכוונתה?

//Copy constructor
Client::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

כאילו לא בניתי את הבנאי בצורה הנכונה, כאילו הוא לא מעתיק את כל האובייקט.

פורסם

אני הייתי ממליץ לך להחזיר מצביע לאיבר, כדי שתוכל לעשות לו 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;

פורסם

זהירות!

אם אתה מחזיר מצביע תוודא שאתה ךא מבצע delete-ים בתוך הרשימה עצמה.

באופן כללי כשעובדים עם מצביעים צריך תמיד לקבוע מי אחראי להם. כמו כן צפה באגים.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים