为什么成员变量没有被修改到函数?
Why isn't the member variable passed to a function modified?
我仍在探索C++试图弄清楚它是如何工作的,并遇到了一些让我困惑的事情。
我有一个类,它只保存一个list<string>
并有几个成员函数
class String_list {
public:
String_list(istream&);
//other functions
list<string> listing;
};
我编写了我的构造函数以使用非成员函数
String_list::String_list(istream& in) { get_strings(in, listing); }
跟
istream& get_strings(istream& in, list<string> lstring)
{
if(in) {
lstring.clear();
string word;
while (in >> word)
lstring.push_back(word);
in.clear();
}
return in;
}
问题是,尽管 get_string
函数似乎有效,但它不会更改我传递给它的listing
成员变量。
我可以通过get_strings
一个参数的成员函数来让它工作,(istream& in)
只需将lstring
更改为listing
,所以我假设从构造函数传递列表由于某种原因不起作用,或者非成员函数无法更改成员变量,但这些似乎是我的编译器很容易接受的事情。
我的编译器没有看到代码有任何问题,只是当我运行可执行文件时,成员列表始终.size()
为 0。
你应该通过引用传递lstring
:
istream& get_strings(istream& in, list<string>& lstring)
代码编译并按原样工作:传递 lstring 的值,从而复制它。所有更改都是在临时对象上进行的,然后在销毁对象时丢弃。
您正在将成员变量的副本传递给函数。 修改本地副本,而不修改成员变量。
更改 get_strings
函数的签名以引用列表对象,这将起作用:
istream& get_strings(istream& in, list<string>& lstring)
{
// ...
}
虽然这会破坏封装,但在您的情况下(直接向该函数公开成员变量)。 更好的方法可能是让 get_strings
函数返回它填充的列表的副本,然后将其分配给初始值设定项列表中的类成员。 喜欢这个:
list<string> get_strings(istream& in)
{
list<string> r;
// ...
return r;
}
然后你的构造函数:
StringList::StringList(istream& in) : listing(get_strings(in))
{
// ...
}
C++你是通过值传递,而不是通过引用传递,除非你明确地这样做。因此,如果您声明函数:
istream& get_strings(istream& in, list<string> lstring)
然后lstring
按值传递,这意味着您使用的对象与在函数调用中传递的对象不同。您只需创建此对象的副本,即使您在函数体中修改它,也只会修改此副本。
如果要修改传递的对象,则应通过引用传递它,这可以通过使用&
来实现:
istream& get_strings(istream& in, list<string>& lstring)
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何从子成员函数修改父公共成员变量
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 使用指针算法修改函数中的 2D 数组
- 如何修改函数中的对象?
- C++ 修改函数内部的字符
- 修改函数内的多维数组
- 如何修改函数内的字符数组
- 如何修改函数中的迭代器
- 是否可以用最少的代码更改来修改函数调用
- C/C++样式--修改函数参数
- 修改函数以使用 SSE 内部函数
- 修改函数中的指针值
- C++通过引用修改函数中的结构值(可能存在编译顺序问题)
- 如何从c++的主脚本修改函数中的变量
- 通过bash-script查找和修改函数定义(c++)
- 修改函数中二维引用数组的值
- 我可以修改函数包装器使其使用旧值吗?
- c++中动态分配和修改函数的内存
- 如何在没有模板方法的情况下修改函数行为