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
字段似乎合理。祝你好运:)