多次使用+=,改变是相反的c++

use += several times, changes are reversed c++

我实现了 class vl_vector 和派生 class vl_string,这与 STL 向量非常相似(vl_string 用于字符和处理 '\0' 字符)。 我已经为 char、char * 和另一个 vl_string 重载了 += 运算符。 声明:

  vl_string<StaticCapacity> operator+=(const vl_string<StaticCapacity>&vs);
  vl_string<StaticCapacity> operator+=(const char *str);
  vl_string<StaticCapacity> operator+=(char c);

函数代码:

template<size_t StaticCapacity>
vl_string<StaticCapacity> vl_string<StaticCapacity>::operator+= (const char *str)
{
  size_t len = strlen(str);
  //insert string before the '[=11=]' char.
  vl_string<StaticCapacity>::insert(this->end() - 1, str, str + len);
  return *this;
}

template<size_t StaticCapacity>
vl_string<StaticCapacity> vl_string<StaticCapacity>::operator+= (const char c)
{
// push char to the end of string.
  this->push_back (c);
  return *this;
}

template<size_t StaticCapacity>
vl_string<StaticCapacity>
vl_string<StaticCapacity>::operator+= (const vl_string &vs)
{
  auto first = vs.cbegin();
  auto last = vs.cend() - 1; // to not include the '[=11=]' char.
  // iterate over vl_string and insert each char to the end of string.
  while (first != last)
  {
    this->push_back (*first);
    first++;
  }
  return *this;
}

我正在尝试运行以下代码来检查我的程序:

vl_string<> vl_str;
vl_string<> vl_str_to_add = "Never gonna";
(((vl_str += vl_str_to_add) += ' ') += "say goodbye") += '\n';
assert(vl_str.contains ("Never gonna say goodbye\n"));

我在调试器中跟踪程序,似乎一切正常。最后我得到一个 vl_string 包含完整的所需字符串。但是当程序到达行尾时,它会调用析构函数并删除除第一个操作(vl_str += vl_str_to_add)之外的所有内容。 尝试了几件事,但我很困惑,希望得到解释。 谢谢!

您的函数的问题在于它们 return 对象的副本,而不是引用。

使用

vl_string<StaticCapacity>& operator+=(const vl_string<StaticCapacity>&vs);
vl_string<StaticCapacity>& operator+=(const char *str);
vl_string<StaticCapacity>& operator+=(char c);
//                       ^^^ Reference return type.