C ++。更改Object数据成员的数据成员

时间:2016-06-15 18:44:47

标签: c++

这是我的简单代码来说明。有一本书,作为班级内的数据成员。 我想修改来自测试程序的作者的邮件,但是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
}

Live Example

2 个答案:

答案 0 :(得分:2)

  

我想修改测试程序中作者的邮件,但cppbook.getAuthor().setEmail("...")无法正常工作。

如果您要更改与Author getAuthor();关联的内部对象,则

Author& getAuthor();应为Book

否则您只需更改该Author实例的临时副本。

答案 1 :(得分:1)

您按值返回对象,而不是按引用返回。这意味着,您获得了作者的副本,但您并未修改存储在Book类中的那个。

您应该修改

中的签名
Author& Book::getAuthor();

对对象进行更改作者有效