我设计了一个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;
}
我不知道为什么这不起作用。任何帮助表示赞赏...
答案 0 :(得分:1)
你的代码可能不正确。
String s(str1);
这会分配内存,但不知道str2
的大小。
strcat(s.str,str2.str);
现在您将str2
附加到其中。
你必须分配足够的空间。超出已分配内存的写入是未定义行为。
答案 1 :(得分:1)
您忘记显示分配s.str
指向的内存的代码。但是,很容易猜到你没有足够的分配。
解决方案是至少分配s.size
长数组。
答案 2 :(得分:1)
我可以猜到,你究竟是什么问题。我在这里看到了多个问题:
s.str
之前,您必须确保已在strcat()
分配了足够的内存fiend
。要么将运算符实现为成员函数,要么让它们使用公共接口。std::string
。我是一名专业开发人员已有大约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;
}