我正在努力重新创建各种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:错误:âStringoperator + =(const char *)â必须有类或枚举类型的参数 string.cpp:28:错误:?String operator + =(const char *)â必须有类或枚举类型的参数
感谢重载过程中出错的任何信息。
答案 0 :(得分:2)
operator+=
是二元运算符,因此需要两个操作数(例如myString += " str",
,其中myString
和" str"
是操作数。)
但是,你有一个格式错误的operator+=
,因为它只接受一个参数。请注意,您的operator+=
是一个独立的函数(不是类方法),它返回String
并接受单个const char*
参数。
要解决您的问题,请将operator+=
作为成员函数/方法,因为到那时,您将拥有一个隐式this
参数,该参数将用作左侧操作数。< / p>
class String {
...
String& operator+=(const char * p);
};
及其定义
String& String::operator+=(const char * p) {
...
return *this;
}
请注意,您现在返回对*this
的引用,其返回类型已更改为String&
。这些符合Operator overloading中的指南。
关键更新:
temp_buffer = new char(new_size);
不要!您正在分配一个char
并将其初始化为new_size
,这不是您想要的。将其更改为括号。
temp_buffer = new char[new_size];
现在,您正在正确分配new_size
个char
个数组。请不要忘记delete[]
new[]
所有人{{1}}。
答案 1 :(得分:0)
+ =运算符使用c-strings的原因是std::string
具有来自c-strings的隐式转换构造函数。
由于您已经有转换构造函数,因此您应该创建一个+ {{}} {