是否可以通过引用修改属性的属性?
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());
language
的 director
属性确实得到修改,但原始 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
的语法,并通过确保传入的 Director
与 Language
对象一样长的时间来确保指针永远不会悬空。
假设我有一个 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());
language
的 director
属性确实得到修改,但原始 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
的语法,并通过确保传入的 Director
与 Language
对象一样长的时间来确保指针永远不会悬空。