我在弄清楚如何编写复制构造函数时遇到了一些麻烦......
这是我的构造函数:
public:
Person(const char * aName, const char * userID, const char * domain, Date aDate) {
//This constructor should create heap objects
name = new char[strlen(aName) + 1];
strcpy (name, aName);
emailAddress = new EmailAddress(userID, domain);
birthday = new Date(aDate);
cout << "\nPerson(...) CREATING: ";
printOn(cout);
}
这就是我要为我的复制构造函数做的事情:
Person(const Person & p){
name = new char[strlen(p.name)+1];
strcpy(name, p.name);
emailAddress = new EmailAddress(*p.emailAddress);
birthday = new Date(*p.date);
cout << "\nPerson(const Person &) CREATING: ";
printOn(cout);
}
我不确定在我的复制构造函数中为我的新Date和新EmailAddress传递了什么,我现在正在做的事情根本不起作用!
这是我的赋值运算符(我不知道在这里传递日期和emailAddress的内容......):
Person & operator=(const Person & p) {
if(&p != this) {
delete [] name;
delete emailAddress;
delete birthday;
name = new char[strlen(p.name) + 1];
strcpy (name, p.name);
emailAddress = new EmailAddress();
birthday = new Date();
}
return *this;
}
非常感谢任何帮助!
编辑:
日期定义
class Date{ //this class is complete
//This class represents a date
public:
Date(int aDay, int aMonth, int aYear) : day(aDay), month(aMonth), year(aYear) {}
Date(const Date & aDate) : day(aDate.day), month(aDate.month), year(aDate.year) {};
void printOn(ostream & out) const {out << day <<"/" << month << "/" << year;}
答案 0 :(得分:2)
我打算将JimR的评论分解为答案,因为这是一个好建议:如果可能的话,使用C ++类型,而不是C类型。另外,如果可能,请避免使用指针。
例如,您的班级,我们可以看到它,看起来像这样:
class Person {
char *name;
Email *emailAddress;
Date *birthday;
};
如果Date
和Email
足够轻量级(它们应该是),请将它们保留为对象本身的值;另外,将name
设为std::string
:
class Person {
std::string name;
Email emailAddress;
Date birthday;
};
你的构造函数变得非常简单:
Person::Person(const std::string &aName, const std::string &userID, const std::string &domain, Date aDate) :
name(aName),
emailAddress(userID, domain),
birthday(aDate)
{ }
更好的是,C ++为您提供的默认复制构造函数现在才能正常工作。析构函数也是如此,和赋值运算符。免费。 甚至更好,所有这些现在都是异常安全的:如果由于某种原因引发异常,一切都会被清除。
答案 1 :(得分:0)
我得到了它的工作 - 谢谢大家的帮助!我必须传入* p.emailAddress和* p.birthday
Person(const Person & p){
name = new char[strlen(p.name)+1];
strcpy(name, p.name);
emailAddress = new EmailAddress(*p.emailAddress);
birthday = new Date(*p.birthday);
cout << "Person(const & Person)... CREATING: ";
printOn(cout);
}
Person & operator=(const Person & p) {
if(&p != this) {
delete [] name;
delete emailAddress;
delete birthday;
name = new char[strlen(p.name) + 1];
strcpy (name, p.name);
emailAddress = new EmailAddress(*p.emailAddress);
birthday = new Date(*p.birthday);
}
return *this;
}