在子类 C++ 字符串中重载 []

Overloading [] in subclassed C++ string

我在这里 return 什么是正确的?

char BCheckString::operator[](int index)
{
    if (index < 0 || this->length() <= index)
    {
        throw IndexOutOfBounds();
        ???Do I need to return something here???
    }
    else
    {
        return ?????;
    }
}

我试过 return this[index] 但 VS2013 说: "no suitable conversion function from "BCheckString" 到 "char" 存在。我不知道抛出后要 return 什么。

我有:

class BCheckString : public string
{
private:
    bool checkBounds();
public:
    BCheckString(string initial_string);
    char operator[](int index);
    class IndexOutOfBounds{};
};

BCheckString::BCheckString(string initial_string) : string(initial_string)
{
}

char BCheckString::operator[](int index)
{
    if (index < 0 || this->length() <= index)
    {
        //throw IndexOutOfBounds();
        cout << "index out of bounds" << endl;
        return 'A';
    }
    else
    {
        return 'A';
    }
}

显然这是作业 ;)

如果您从 std::string 派生,您可以只使用 c_str() 方法来访问数据。

return this->c_str()[index];

虽然观察到您在这里所做的是不必要的,但语法是:

return string::operator[](index);

您正在呼叫 string parent 的 operator[]。这应该比使用 c_str 更可取,因为 string::operator[] 在调试版本中进行边界检查。

还值得注意的是 .at 已经在发布版本中进行边界检查,并抛出 std::out_of_range.

第一个问题,没有。抛出异常后,不需要有return语句。事实上,如果您这样做,编译器可能会警告您 "unreachable code".

首先,不推荐从std::string派生:Why should one not derive from c++ std string class?

关于您的问题:

1) 在 throw 之后你什么都不 return。

2) 您尝试使用 operator[] 是不正确的,因为您没有调用父 class 的 std::string::operator[]

调用正确的operator[]:

 else
 {
    return std::string::operator[](index);
 }

this 是一个指针,因此 this[index] 会错误地将 this 视为指向实例数组以访问其中的第 index 个实例。那将是 class 本身的一个实例,并且没有从它到声明的 return 类型 char 的隐式转换(这就是错误消息所抱怨的)。

您需要从基本字符串中获取字符,这是通过

完成的
return this->string::operator[](index);