2015-07-21 75 views
-1

我已經沖刷谷歌和計算器了這麼遠沒有明確的答案,所以我直接問...重載運算符=或operator []的使用const char *與/或串

我創建了一個位圖字體類,我想使用賦值運算符:operator =(const char *)將字符串文字分配給類的文本。 注:我也想用字符串,字符串*與char *分配... 例如:

class BitmapText{ 
private: 
    std::string _text; 
public: 
    void operator=(const char* _t){ 
     _text = _t; 
    } 
    /*I've also tried another iteration of this operator using 
    BitmapText& operator=(const char* _t){ 
     _text = _t; 
     return *this; 
    } 
    */ 
    BitmapText(){} 
    ~BitmapText(){} 
}; 


BitmapText* t1 = new BitmapText(); 
t1 = "Hello World" 

分配的字符字符串到BitmapText目標收益率類似以下內容:

Assigning to 'BitmapText*' from 'const char[12]' incompatible type. 

我確定這有一個很好的理由。但它可以通過字符串類來完成。我看着串類,它是從typedef定義:

typedef basic_string<char, char_traits<char>, allocator<char> > string; 

這是爲什麼我可以指定一個字符數組string類?因爲它似乎繼承了char的特性?如果沒有這麼複雜的實現,我可以重載我想要的方式嗎?我想第二個問題是(我認爲)沿着同樣的路線: 我想使用運算符[](const char * _name)返回名稱匹配_name值的子對象。

我看到的每個運算符重載示例都使用與被重載的類相同類類型的右手操作數。然而,我讀過,你可以使用不同的數據類型,我們可以清楚地使用char *來爲std :: string對象賦值...

我錯過了什麼? 任何和所有的幫助非常感謝。

+0

WTF? 't1'是一個指針...你不能爲非用戶定義的類型重載操作符,而指針也不是用戶定義的類型。 –

+0

你忘記解除引用t1。嘗試'* t1 =「Hello World」;' –

+2

您可能想要'BitmapText t1; t1 =「Hello World」;'。除非真的需要這樣做,否則不要動態分配東西。 – Praetorian

回答

4

定義操作員通過以下方式

BitmapText & operator =(const std::string &t) 
{ 
    _text = t; 

    return *this; 
} 

它可用於std::string類型的對象和char *類型的對象,因爲有來自const char *std::string由於隱式轉換類std::string的轉換構造函數。

至於這個代碼片斷

BitmapText* t1 = new BitmapText(); 
t1 = "Hello World" 
^^^    ^^ 

那麼它被改寫如下方式

BitmapText* t1 = new BitmapText(); 
*t1 = "Hello World"; 

本聲明

t1 = "Hello World"; 

是錯誤的,因爲你想分配類型爲const char *的指針指向BitmapText *類型的指針。

+0

char ** const ** * –

4

您正試圖分配給t1,這不是BitmapText,而是指向BitmapText的指針;

如果你這樣做*t1 = "Hello World";它應該工作。

+0

謝謝!這工作!我花了幾個小時去忘記明顯的... – hwill

0

您試圖將指定給一個指針,一個字符串文字的地址。 而是嘗試:

BitmapText* t1 = new BitmapText(); 
(*t1)= "Hello World"; 
+2

原來的運營商很好。你建議的替代品不是。如果我們要迂腐,小寫字母前的單個_不被保留。 –

+0

爲什麼'(* t1)'而不是簡單的't1'? –

+0

可讀性,習慣,在某些情況下,一些編譯器會發出警告(我認爲是叮噹聲)。 –