在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的+ =运算符。

链接地址: http://www.djcxy.com/p/73107.html

上一篇: Overloading custom string operator += in c++

下一篇: Overloading << operator in c++?