多次使用+=,改变是相反的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.
我实现了 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.