在c ++中重载自定义字符串运算符+ =

时间:2014-02-03 06:35:37

标签: c++ operator-overloading

我正在努力重新创建各种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 *)â必须有类或枚举类型的参数

感谢重载过程中出错的任何信息。

2 个答案:

答案 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_sizechar个数组。请不要忘记delete[] new[]所有人{{1}}。

答案 1 :(得分:0)

+ =运算符使用c-strings的原因是std::string具有来自c-strings的隐式转换构造函数。

由于您已经有转换构造函数,因此您应该创建一个+ {{}} {