所以我尝试使用智能指针重新实现我自己的字符串类,这样我就可以练习将它们集成到我的日常使用中。可悲的是,我已经撞墙了,我无法弄清楚为什么我无法连接两个“mystring”对象。有什么建议?此外,如果这种类型的程序不适合使用智能指针,我也会很感激与此相关的建议。
#include <iostream>
#include <memory>
#include <cstring>
using namespace std;
class mystring {
public:
mystring() : word(make_unique<char[]>('\0')), len(0) {}
~mystring() { cout << "goodbye objects!";}
mystring(const char *message) : word(make_unique<char[]>(strlen(message) + 1)), len(strlen(message)) {
for (int i = 0; i < len; i++) word[i] = message[i];
}
mystring(const mystring &rhs) : word(make_unique<char[]>(rhs.len)), len(rhs.len + 1) {
for (int i = 0; i < len; i++) word[i] = rhs.word[i];
}
mystring &operator=(mystring &rhs) {
if (this != &rhs) {
char *temp = word.release();
delete[] temp;
word = make_unique<char[]>(rhs.len + 1);
len = rhs.len;
for (int i = 0; i < len; i++) word[i] = rhs.word[i];
}
return *this;
}
mystring &operator=(const char *rhs) {
char *temp = word.release();
delete[] temp;
word = make_unique<char[]>(strlen(rhs)+ 1);
len = strlen(rhs);
for (int i = 0; i < len; i++) word[i] = rhs[i];
return *this;
}
friend mystring operator+(const mystring& lhs, const mystring& rhs) {
mystring Result;
int lhsLength = lhs.len, rhsLength = rhs.len;
Result.word = make_unique<char[]>(lhsLength + rhsLength + 1);
Result.len = lhsLength + rhsLength;
for (int i = 0; i < lhsLength; i++) Result.word[i] = lhs.word[i];
for (int i = lhsLength; i < lhsLength + rhsLength; i++) Result.word[i] = rhs.word[i];
return Result;
}
friend ostream &operator<<(ostream &os, mystring &message) {
for (int i = 0; i < message.len; i++) os << message.word[i];
return os;
}
private:
int len;
unique_ptr<char[]> word;
};
int main()
{
mystring word1 = "Darien", word2 = "Miller", word3;
cout << word1 + word2;//error message: no binary '<' found
word3 = word1 + word2;//error message: no binary '=' found
cout << word3;
return 0;
}
答案 0 :(得分:1)
将参数message
的{{1}}类型从operator<<
(对非const引用)更改为mystring &
(对const的引用):
const mystring &
friend ostream &operator<<(ostream &os, const mystring &message) {
for (int i = 0; i < message.len; i++) os << message.word[i];
return os;
}
按值返回,因此返回的是临时的,不能绑定引用非const。
请注意,您应该这样做不仅是为了解决这个问题; operator+
不应该通过引用非const来传递,因为参数不应该在message
内修改。