2009-08-22 161 views
4

我在学习cpp和在我上一次的任务中,我重写了std :: string类。 所以这里是我的代码的轮廓: string类:C++:错误:类型'String *'和'const char [7]'的无效操作数到二进制'operator +'

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; 
}; 

哦,我必须说,我想声明的方法为字符串*运算符+(为const char *海峡)和常量字符串&运营商+( 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: error: invalid operands of types ‘String*’ and ‘const char [7]’ to binary ‘operator+’

我抬头对谷歌和我在书里我从没有成功学习。 任何一个有建议吗? (我很确定我在做一些愚蠢的事情,你将不得不原谅我,我原来是一个PHP程序员)可以有人指出我错过了什么?

回答

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这个例子是不是你通常会想用这样的字符串类。

+0

好主意,但现在当我这样做: String testing = new String(“Hello,”); 我收到以下(相同)错误: foobar.cc:11:错误:从'String *'转换为非标量类型'String' – 2009-08-22 22:55:26

+2

注意我在示例中删除了该行的关键字“new”。使用“新”分配堆上的东西,并返回一个指针;没有“新建”,它是堆栈中的对象的构造函数调用。 – 2009-08-22 22:59:50

+0

哦,对,谢谢! – 2009-08-22 23:05:40

3

您的运营商+定义为Stringconst* char,而不是String*。您应该取消引用testing在这种情况下将其添加,即:

String a = (*testing) + "World"; 

虽然之前我没有看到使得测试的拳头代替指针点。

编辑:没有指针创建一个字符串应该是这样的:

String testing = "Hello, "; 

String testing("Hello, "); 

(两者是等同的)。

+0

That worked :), 但是现在我试图在施工时不使用指针表示法,而我在构造线上得到相同的错误: foobar.cc:11:错误:从'String *'转换为非标量类型'String'请求 我不得不承认,这些指针对begginer来说是相当混乱的。 – 2009-08-22 22:58:41

相关问题