是否可以通过引用修改属性的属性?

Is it possible to modify an attribute's attribute via reference?

假设我有一个 Language class 和一个 Director class。

class Language
{
private:
    std::string name;
    Director director;
public:
    Language(std::string name);
    std::string getName() { return this->name; };
    Director& getDirector() { return this->director; };
    void setDirector(const Director& director) { this->director = director; };
}

class Director
{
private:
    std::string main_language;
public:
    Director();
    std::string getMainLanguage() { return this->main_language; };
    void setMainlanguage(std::string language) { this->main_language = language; };
}

两个class是一对一的关系,Language存储一个Director对象,而Director只存储Language 作为一个字符串。

现在,如果我这样做:

Language language("English");
Director director;

language.setDirector(director);
language.getDirector().setMainLanguage(language.getName());

languagedirector 属性确实得到修改,但原始 director 没有。我认为在 Language 的 getter 和 setter 中使用引用会有效,但显然无效。显然,我可以只使用 director.setMainLanguage() 但这不是我想要的。

发生这种情况是否有任何原因,或者我应该尝试另一种方法来实现这一目标?

在这个函数中:

void setDirector(const Director& director) { this->director = director; };

尽管您通过引用接受了 Director,但您在正文中进行了复制,因此您最终没有更改原始 Director 参数。

您可以将 director 成员设为 Director&,但随后您 必须 Language 的构造函数中初始化此引用。例如:

class Language
{
private:
    std::string name;
    Director &director;
public:
    Language(std::string name, Director &d) : director(d), name(name) {}
// ...
}

并这样称呼它:

Director director;
Language language("English", director);

您也可以将 director 成员设为 Director *。但是,您必须更改 GetDirector 的语法,并通过确保传入的 DirectorLanguage 对象一样长的时间来确保指针永远不会悬空。