【问题标题】:passing string by reference and updating its value through function argument in C++通过引用传递字符串并通过 C++ 中的函数参数更新其值
【发布时间】:2014-03-25 16:18:36
【问题描述】:

所以如果我有这样的功能:

void edit(string& s) {
    //do something with s
}

我像这样使用它:

std::string str = "Hello";
edit(str);

这将更新str 的值。

但现在我有一个类,其中头文件有一个构造函数,如:

class MyClass {

   private:
      //something
   protected:
      std::string& str;
   public:
      //something

   MyClass(std::string& s): str(s){}
};

后来在源文件中,我计算了一个字符串,我想通过传递给构造函数的字符串参数来更新它,但它不起作用。

您能否给我一些想法,我怎样才能使它工作,这样我分配 std::string 值的类变量反映在传递给该类的构造函数的参数字符串中。

谢谢,

更新:

按照建议进行上述更改(使 str 成为参考),我收到此错误:

“错误:str 必须在 cosntructor 基/成员初始化列表中初始化”

更新 - 解决方案:

嗨,所以按照这种方法我似乎找到了解决方案:

  class MyClass {

       private:
          //something
       protected:
          std::string* str;
       public:
          //something

       MyClass(std::string* s): str(s){}
    };

后来,我有:

string mystring;

MyClass(&mystring); 瞧,它似乎运作良好。

【问题讨论】:

  • 成员变量 str 中缺少 &... 应该是引用而不是变量...
  • 您传递给构造函数的字符串无关紧要。您的对象具有该字符串的 副本。如果您无权访问该副本,则您无权访问。

标签: c++ pass-by-reference


【解决方案1】:
MyClass(std::string& s): str(s){}

str(s)s 的内容复制到str。因为,str 不是引用变量,所以它是一个副本,不会影响传递的参数。使类成员成为引用变量。但要注意传递参数的生命周期。

【讨论】:

  • 谢谢,但是如果我尝试声明 str 一个引用,它不会编译并且我得到错误未初始化的引用变量?
  • visual studio 2010,但是引用成员不是必须立即初始化吗?但是好的,我很快就会仔细检查
  • 这就是初始化列表的目的。
  • 你确实希望你的课程中有参考成员。
  • @n.m.当然,但你能建议我如何更新作为参数传递给类的构造函数的变量,如果我尝试使用 bool 相同的过程它可以工作,(不是引用,而是使用 poitner)但使用 std::string 它似乎失败
猜你喜欢
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2018-08-13
  • 2018-02-12
相关资源
最近更新 更多