2013-10-19 33 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