2009-08-22 159 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

相關問題