2013-10-19 32 views
4

我想在C++ 11中創建自己的字符串類,但是我遇到了一些問題。我不能弄清楚如何使用std :: string.at(int)='a';如果使用std :: string.at(int)方法/過載。C++運算符重載,我自己的字符串類

我已經創造了在我自己的類(int)方法:

int at(int index) 
{ 
    if(index <0 || index > size-1) {throw std::out_of_range("Error, index out of range");} 
    return data[index]; 
} 

而且workd好,如果我只用:

MyString.at(2); 

在主文件:

MyString = "Hello world!"; //Works fine! 
MyString.at(2)='a'; //Gives, Error: expressino must be a modifiable Ivalue. 

任何幫助,這將是偉大的,謝謝!

+0

你看過字符串類的文檔嗎? –

+0

這不是問題,但'index> size-1'可以更通俗地寫成'index> = size'。 –

回答

3

至少有一個at()成員函數需要返回一個非const引用至char。就像這樣:

char &at(std::size_t idx) 
{ 
    return data[idx]; 
} 

這將是有益的定義const版的功能太:

const char &at(std::size_t idx) const 
{ 
    return data[idx]; 
} 

還要注意使用std::size_t(這是一個無符號類型保證足夠大代表任何大小)。這樣你可以提高可移植性,而且你不必檢查負指數。

+0

有一個const版本也可能是明智的。 – chris

+0

現在我看到了明顯的問題!感謝您的幫助! – user2774429

+0

@chris夠好的。你的意思是說,成員函數本身應該是'const',或者返回值應該是''const引用''字符? (前者更有意義,只需檢查。) – 2013-10-19 21:40:46

1

您正在返回一個整數,而不是人物的引用,你可能想:

char& at(int index) 

當然,你需要返回正確的字符類型,但在任​​何情況下,你需要返回引用以便呼叫者能夠分配給它。

+0

Owooo ..我覺得多麼愚蠢! 謝謝你的回答! – user2774429