我正在学习cpp,在我的上一个作业中,我正在重写std :: string类。 所以这是我的代码大纲: 字符串类:
class String {
public:
String(const char* sInput) {
string = const_cast<char*> (sInput);
}
const String operator+(const char* str) {
//snip
print();
}
void print() {
cout<<string;
}
int search(char* str) {
}
private:
char* string;
int len;
};
哦,我不得不说我试图将方法声明为String * operator +(const char * str)和const String&amp; operator +(const char * str)没有变化。 以下是我如何运行它:
int main(int argc, char* argv[]) {
String* testing = new String("Hello, "); //works
testing->print();//works
/*String* a = */testing+"World!";//Error here.
return 0;
}
完整的错误是这样的:
foobar.cc:13:错误:操作数无效 类型'String *'和'const char [7]'到二元'运算符+'
我抬头看谷歌,在我正在学习的书中没有成功。 有建议吗? (我很确定我正在做一些愚蠢的事情,你必须原谅我,我原本是一名PHP程序员)任何人都可以指出我错过了什么?
答案 0 :(得分:5)
您可能不希望将指针用于String
类。试试这段代码:
int main(int argc, char* argv[]) {
String testing = String("Hello, "); //works
testing.print();//works
String a = testing+"World!";
return 0;
}
为C ++类型定义新运算符时,通常会直接使用实际类型,而不是指向类型的指针。像上面那样分配的C ++对象(如String testing
)在堆栈上分配(一直存在“范围”或函数结束)而不是堆(直到程序结束)。
如果你真的想使用指向你的类型的指针,你可以像这样修改最后一行:
String *a = new String(*testing + "World!");
但是,遵循std::string
的示例,这通常不是您通常想要使用此类字符串类的方式。
答案 1 :(得分:3)
您的运营商+是为String
和const* char
定义的,而不是String*
。在添加之前,您应该取消引用testing
,即:
String a = (*testing) + "World";
虽然在这种情况下,我没有看到在第一步测试指针的重点。
编辑:创建没有指针的字符串将如下所示:
String testing = "Hello, ";
或
String testing("Hello, ");
(两者都相同)。