这是我的简单代码来说明。有一本书,作为班级内的数据成员。 我想修改来自测试程序的作者的邮件,但是cppbook.getAuthor()。setEmail(“...”)不起作用。我尝试通过引用传递。 我发现了一个替代但不满意的。必须是一个简单的答案,我想我会想念。
class Author {
private:
string name;
string email;
public:
Author(string name, string email) {
this->name = name;
this->email = email;
}
string getName() {
return name;
}
string getEmail() {
return email;
}
void setEmail(string email) {
this->email = email;
}
void print() {
cout << name << "-" << email << endl;
}
};
class Book {
private:
string name;
Author author; // data member author is an instance of class Author
public:
Book(string name, Author author)
: name(name), author(author) {
}
string getName() {
return name;
}
Author getAuthor() {
return author;
}
void print() {
cout << name << " - " << author.getEmail() << endl;
}
void setAuthorMail(string mail) {
author.setEmail(mail);
}
};
int main() {
Author john("John", "john@gmail.com");
john.print(); // John-john@gmail.com
Book cppbook("C++ Introduction", john);
cppbook.print();
cppbook.getAuthor().setEmail("peter@gmail.com");
cppbook.print(); //mail doesn't change: C++ Introduction - john@gmail.com
cppbook.setAuthorMail("andrew@gmail.com");
cppbook.print(); //mail changes: C++ Introduction - andrew@gmail.com
}
答案 0 :(得分:2)
如果您要更改与我想修改测试程序中作者的邮件,但
cppbook.getAuthor().setEmail("...")
无法正常工作。
Author getAuthor();
关联的内部对象,则 Author& getAuthor();
应为Book
。
否则您只需更改该Author
实例的临时副本。
答案 1 :(得分:1)
您按值返回对象,而不是按引用返回。这意味着,您获得了作者的副本,但您并未修改存储在Book类中的那个。
您应该修改
中的签名Author& Book::getAuthor();
对对象进行更改作者有效