C ++运算符重载和字符串Concetanation

时间:2015-10-13 13:48:41

标签: c++

我设计了一个String类(我知道已经有一个)
类似的东西:

class String{
private:
char * str;
int size;
public:
String();
String(const String&);
String(char[]);
friend String operator+(const String&, const String&);

char* getStr() const {
    return str;
}


};    

这是operator +的代码:

String operator+(const String& str1, const String& str2){

  String s(str1); //got a copy constructor, didn't put here, and this works, this is not the problem.
  s.size=str1.size+str2.size+1; //+1 for null character at the end, not sure if necessary here, keeping the size like this is also not used anywhere...
  strcat(s.str,str2.str);
  return s;
}

我不知道为什么这不起作用。任何帮助表示赞赏...

4 个答案:

答案 0 :(得分:1)

你的代码可能不正确。

String s(str1);

这会分配内存,但不知道str2的大小。

strcat(s.str,str2.str);

现在您将str2附加到其中。

你必须分配足够的空间。超出已分配内存的写入是未定义行为。

答案 1 :(得分:1)

您忘记显示分配s.str指向的内存的代码。但是,很容易猜到你没有足够的分配。

解决方案是至少分配s.size长数组。

答案 2 :(得分:1)

我可以猜到,你究竟是什么问题。我在这里看到了多个问题:

  1. 在致电s.str之前,您必须确保已在strcat()分配了足够的内存
  2. 你应该像斑块一样避免fiend。要么将运算符实现为成员函数,要么让它们使用公共接口。
  3. 不知道原因,为什么要实现自己的字符串类。不要这样做。有可能,您无法以任何方式远远超过std::string
  4. 我是一名专业开发人员已有大约20年的历史,并且在大约12年之前一直是业余爱好者。我曾在许多不同公司从事过许多不同的项目,他们的需求各不相同。我确实有一个问题可以证明自定义字符串类是零次。在我看来,你应该将标准库视为语言的一部分而不是尝试重新发明轮子,但这次是方形的。

答案 3 :(得分:0)

感谢。我完全错过了内存分配。感谢大家。这是我的新操作符+功能:

String operator+(const String& str1, const String& str2){
String s;
s.size=str1.size+str2.size+1;
s.str=new char[s.size];
strcat(s.str,str1.str);
strcat(s.str,str2.str);
return s;
}