在c ++中重载自定义字符串运算符+ =
我正在努力重新创建各种c ++类型,以便更好地理解它们的工作方式。 我目前停留在+ =运算符上,无法找到我的声明出现的问题。 以下是我的课程代码:
class String {
int size;
char * buffer;
public:
String();
String(const String &);
String(const char *);
int length(){return size;};
friend bool operator==(const String &, const String &);
friend bool operator<=(const String &, const String &);
friend bool operator<(const String &, const String &);
friend ostream & operator<<(ostream &, const String &);
char operator[](const int);
// friend String operator+=(const String &,const char * p);
friend String operator+=(const char * p);
};
我得到这些按计划工作,除了+ =运算符定义为:
String operator+=(const char * p){
int p_size = std::char_traits<char>::length(p);
int new_size = size+p_size;
char * temp_buffer;
temp_buffer = new char(new_size);
for(int i=0; i<size; i++){
temp_buffer[i] = buffer[i];
}
for(int i=size, j=0; j<p_size;i++,j++){
temp_buffer[i] = p[j];
}
delete buffer;
buffer = new char[new_size];
size = new_size;
for(int i=0; i<size; i++){
buffer[i] = temp_buffer[i];
}
return *this;
}
我的错误是string.h:29:错误:?字符串运算符+ =(const char *)?必须有类或枚举类型的参数string.cpp:28:错误:?字符串运算符+ =(const char *)?必须有参数类或枚举类型
任何有关我在重载过程中出错的信息都会很感激。
operator+=
是二元运算符,因此需要两个操作数(例如, myString += " str",
,其中myString
和" str"
是操作数)。
然而,你有一个格式不正确的operator+=
,因为它只接受一个参数。 请注意,您的operator+=
是一个独立函数(不是类方法),它返回一个String
并接受一个const char*
参数。
为了解决你的问题,让你的operator+=
的成员函数/方法,因为那时,你就会有一个隐含的this
参数,该参数将被用作左侧操作数。
class String {
...
String& operator+=(const char * p);
};
及其定义
String& String::operator+=(const char * p) {
...
return *this;
}
请注意,您现在正在返回对*this
的引用,并且其返回类型更改为String&
。 这些符合运营商超载的准则。
关键更新:
temp_buffer = new char(new_size);
不要! 您正在分配一个char
并将其初始化为new_size
,而这不是您想要的。 将其更改为括号。
temp_buffer = new char[new_size];
现在,你正在分配一个new_size
数组的char
数组。 并且请不要忘记delete[]
所有你new[]
。
+ =运算符与c字符串一起工作的原因是std::string
s有一个来自c字符串的隐式转换构造函数。
既然你已经有了一个转换构造函数,你应该只做一个带有String
的+ =运算符。