C++ 运算符重载,自定义字符串类

4

我正在尝试在C++11中制作自己的字符串类,但我遇到了一些问题。与std::string类比较时,我无法弄清如何使用std::string.at(int) = 'a';方法或重载。

我已经在我的自定义类中创建了at(int)方法:

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

如果我只使用以下代码,它可以很好地工作:

MyString.at(2);

在主文件中:

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

任何关于这方面的帮助都会很棒,谢谢!

你有查看字符串类的文档吗? - David Heffernan
这不是问题,但是index > size-1可以更习惯地写成index >= size - Pete Becker
2个回答

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(它是一种无符号类型,保证足够大以表示任何大小)。这样可以提高可移植性,而且您不必检查负索引。


最好也有一个const版本。 - chris
现在我看到了明显的问题!谢谢你的帮助! - user2774429
@chris 好的。你是指成员函数本身应该是const,还是返回值应该是一个指向const char的引用?(前者更有意义,只是确认一下。) - user529758
@H2CO3,与下标运算符重载相同。两者结合。 - chris

1
你正在返回一个整数而不是字符的引用,你可能想要这样做:
char& at(int index)

当然,您需要返回正确的字符类型,但无论如何,为了使调用者能够对其进行赋值,您都需要返回一个引用。

哦喔喔..我感觉自己好蠢啊! 谢谢你的回答! - user2774429

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接