为什么成员变量没有被修改到函数?

Why isn't the member variable passed to a function modified?

本文关键字:修改 函数 成员 变量 为什么      更新时间:2023-10-16

我仍在探索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)