C++ 是否可以修改属性';s属性是否通过引用?

C++ 是否可以修改属性';s属性是否通过引用?,c++,pass-by-reference,C++,Pass By Reference,假设我有一门语言课和一门导演课 class Language { private: std::string name; Director director; public: Language(std::string name); std::string getName() { return this->name; }; Director& getDirector() { return this->director; }; voi

假设我有一门
语言
课和一门
导演

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; };
}
两个类之间存在一对一的关系,
Language
存储
Director
对象,而
Director
仅将
语言的名称存储为字符串

现在,如果我这样做:

Language language("English");
Director director;

language.setDirector(director);
language.getDirector().setMainLanguage(language.getName());
language
director
属性确实会被修改,但原始的
director
不会被修改。我认为在
语言的getter和setter中使用引用可能会奏效,但显然不行。显然,我可以只使用
director.setMainLanguage()
,但这不是我想要的

发生这种情况有什么原因吗?或者我应该尝试另一种方法来实现这一点吗?

在此函数中:

void setDirector(const Director& director) { this->director = director; };
即使您通过引用接受
Director
,但您在正文中复制了一个副本,因此最终不会更改原始
Director
参数

您可以将
控制器
成员设为
控制器&
,但随后必须在
语言的构造函数中初始化此引用。e、 g:

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);
您也可以将
主管
成员设置为
主管*
。但是,您必须更改
GetDirector
的语法,并确保传入的
Director
Language
对象的寿命一样长,从而确保指针永远不会摆动。

在此函数中:

void setDirector(const Director& director) { this->director = director; };
即使您通过引用接受
Director
,但您在正文中复制了一个副本,因此最终不会更改原始
Director
参数

您可以将
控制器
成员设为
控制器&
,但随后必须在
语言的构造函数中初始化此引用。e、 g:

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);

您也可以将
主管
成员设置为
主管*
。不过,您必须更改
GetDirector
的语法,确保传入的
Director
Language
对象的寿命一样长,从而确保指针永远不会摆动。

“我认为在语言的getter和setter中使用引用可能会起作用,但显然不行。”--在getter中使用引用确实有效,因为此代码修改了
语言
控制器
成员。只有setter没有按照您认为的方式工作(它没有将局部变量链接到成员)。“我认为在语言的getter和setter中使用引用会起作用,但显然没有。”--在getter中使用引用确实有效,因为此代码修改了
语言
控制器
成员。只有setter没有按照您认为的方式工作(它没有将局部变量链接到成员)。不幸的是,我无法更改构造函数,因为还涉及其他类。。使用指针看起来是个好主意,但我认为它会变得太复杂。我将使用
int-id
作为
director
的属性,并尝试解决问题。我同意指针变得复杂。
id
字段似乎合理。祝你好运:)不幸的是,我无法更改构造函数,因为还涉及其他类。。使用指针看起来是个好主意,但我认为它会变得太复杂。我将使用
int-id
作为
director
的属性,并尝试解决问题。我同意指针变得复杂。
id
字段似乎合理。祝你好运:)