在子类 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);
我在这里 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);