2016-03-07 71 views
-3

每次使用C++程序時,我都記得所有可能被髮明用來吃米飯的器具的模因,「兩根棍子是如何贏得的」。 所以讓我解釋一下這個問題。我想要創建一個類字符串,這些字符串的行爲完全是視覺基本的字符串。C++的字符串

class kstring 
{ 
    char *value; 
    public: 
    kstring(char *val) 
    { 
     value=val; 
    } 
    kstring operator+(kstring *val) 
    { 
     //some code here that works 
    } 

    kstring &operator=(kstring s2) 
    { 
     value=s2.value; 
     return *this; 
    } 

}; 

所以這是所有... 創作者功能允許類似VB的decleration:

kstring s="Hello World"; 

其他的事情是有點怪; 讓我們嘗試用一個printf():

printf("%s\n",s); //I prefear printf as cout because more redeable 

它的工作原理只有在私人「的char *值」得到聲明爲首位。當然s是一個指針,沒有人知道在什麼時候。所以編譯器(代碼塊),幸運的是將它讀爲char數組。但是我不知道這是否會在每個編譯器和環境中完成,如果在實踐中是正確的,如果有更好的方法來定義它,比如vb指令「Default」。 二時會被分配=

kstring s,s2; 
s="try "; 
s2="again"; 
s=s+s2; 

printf("%s\n",s); 

在調試的功能裏面,它結合正是「再試一次」,但printf的只顯示地址,所以我的任務功能不起作用;有人建議做一個簡單的課程來處理字符串?

+8

你爲什麼不使用[std :: string](http://en.cppreference。com/w/cpp/string/basic_string)從標準庫? –

+0

對於賦值,您必須以'const char *'作爲參數來實現[賦值運算符](https://en.wikipedia.org/wiki/Assignment_operator_(C%2B%2B))。但是'std :: string'是「標準字符串」,對大多數情況來說已經夠用了。在printf中使用's.c_str()'。一旦你採納了一個新的想法,它很容易使用它。 – Dialecticus

+0

可能有幫助:[printf和自定義類](http://stackoverflow.com/q/12069623/2372759) – MagunRa

回答

2

我推薦學習使用std::string。它並不完美(實際上它有很多缺陷),但它別人正在使用的東西,它已被寫入。

與任何C++類一樣,您需要擔心內存管理。也就是說,類是否擁有它傳遞的指針,還是隻是假定指向內存的指針會超過指向它的對象。我強烈建議班級應該擁有指針。

所以構造將需要變成:

kstring::kstring(const char* c) 
{ 
    const auto len = strlen(c); 
    value = new char[len+1]; 
    strcpy(value,len); 
} 

賦值操作符也需要一個類似的變化。現在你需要編寫一個析構函數(釋放內存)和一個拷貝構造函數(創建拷貝)。你也應該添加一個移動構造函數和一個移動賦值操作符。你可以通過假設內存總是超過課程來節省所有這些複雜性 - 但是a)我不明白你是如何編寫的,b)它使得你的調用者變得更加困難。

operator +應該是一個外部函數(有兩個參數),可能需要成爲該類的一個朋友(但不必如果您將operator +=作爲成員編寫)。

您無法將類對象傳遞給printf。對不起 - 這只是未定義的行爲。你的編譯器很幸運。所以你需要定義一個將kstring轉換回const char *的函數。 std::string版本被稱爲c_str() - 您可以使用該名稱或其他名稱。

您還應該認真考慮允許一個len函數和索引。

+0

我不明白爲什麼OP將不得不擔心內存管理,如果字符串只是指向一個字符串文字。 – juanchopanza

+0

這是能夠假設指針超出類的一個例子(或者更準確地說,指向內存超過引用內存的對象)。然而,這對於運營商+' –

+0

抱歉不會是真的。我錯過了'operator +'。這改變了一切。 – juanchopanza