C++ C++;:如何通过异常处理从越界数组返回值?

C++ C++;:如何通过异常处理从越界数组返回值?,c++,arrays,exception,try-catch,C++,Arrays,Exception,Try Catch,使用异常形式返回越界数组的值时遇到问题 我在主脚本中使用类数组创建一个数组对象,例如长度为10。然后我尝试将数组的第11个元素设置为某个值。在我的类数组中,当数组的索引大于数组的大小时,我从类ArrayOutOfBounds中返回一个值,在本例中是这样的。在我的主脚本中,我从ArrayOutofBounds类中捕获这个对象,以给出越界索引和一条表示数组越界的终端消息。但是,如何返回我试图将第11个元素设置为的实际值 情况如下: 类ArrayOutOfBounds+重载运算符 但是,如何返回我试图

使用异常形式返回越界数组的值时遇到问题

我在主脚本中使用类数组创建一个数组对象,例如长度为10。然后我尝试将数组的第11个元素设置为某个值。在我的类数组中,当数组的索引大于数组的大小时,我从类ArrayOutOfBounds中返回一个值,在本例中是这样的。在我的主脚本中,我从ArrayOutofBounds类中捕获这个对象,以给出越界索引和一条表示数组越界的终端消息。但是,如何返回我试图将第11个元素设置为的实际值

情况如下:

类ArrayOutOfBounds+重载运算符 但是,如何返回我试图将第11个元素设置为的实际值

您没有对该函数进行任何设置。由于函数返回一个引用,您的类不知道调用方在用它做什么。它可以设置一个值,制作一个副本,将其传递给一个函数,它只是不知道。如果需要知道,则需要重写运算符以重载函数运算符
()
,然后可以获取索引和要在索引处设置的值

然后,您可以修改
ArrayOutOfBounds
以接受两个参数。索引和值,然后您可以在catch块内访问它们

但是,如何返回我试图将第11个元素设置为的实际值

您没有对该函数进行任何设置。由于函数返回一个引用,您的类不知道调用方在用它做什么。它可以设置一个值,制作一个副本,将其传递给一个函数,它只是不知道。如果需要知道,则需要重写运算符以重载函数运算符
()
,然后可以获取索引和要在索引处设置的值


然后,您可以修改
ArrayOutOfBounds
以接受两个参数。索引和值,然后您可以在catch块内访问它们。

当前写入的
运算符[]
无法执行此操作,因为在尝试为引用赋值之前会引发异常

您可以编写一个不同的成员函数来设置值,该值包含两个参数,一个索引和一个值,而不是使用
运算符[]

void setAt(int index, double value) {
    if (index < 0 || index >= values.size())
        throw ArrayOutOfBounds{index, value}; 
    values[index] = value;
}


但我认为通常最好避免使用代理对象(只要询问任何试图使用
vector
)的人即可。

使用
操作符[]
是不可能的,因为它当前是编写的,因为在尝试为引用赋值之前会引发异常

您可以编写一个不同的成员函数来设置值,该值包含两个参数,一个索引和一个值,而不是使用
运算符[]

void setAt(int index, double value) {
    if (index < 0 || index >= values.size())
        throw ArrayOutOfBounds{index, value}; 
    values[index] = value;
}


但我认为通常最好避免使用代理对象(只要问问任何试图使用
vector
)的人就可以了。

您是否仔细检查了代码并确保遇到了异常?不应该是索引> =大小?OT:术语——C++程序不是脚本。标准还保留了以
开头的变量名。如果从继承,则可以
重写
方法,以写出您想要的任何内容,包括索引。赋值表达式永远不会计算,因为在计算
数组[11]
时会引发异常。因此,您无权访问赋值表达式的另一个操作数。@Galik名称以
开头,后跟大写字母。或者包含双下划线。您是否逐级检查代码并确保遇到异常?不应该是索引> =大小?OT:术语——C++程序不是脚本。标准还保留了以
开头的变量名。如果从继承,则可以
重写
方法,以写出您想要的任何内容,包括索引。赋值表达式永远不会计算,因为在计算
数组[11]
时会引发异常。因此,您无权访问赋值表达式的另一个操作数。@Galik名称以
开头,后跟大写字母。或者包含双下划线。是的,谢谢,我确实已经沿着这条轨道思考了是的,谢谢,我确实已经沿着这条轨道思考了
int main() {

Array array(10) ;

try {
    array[11] = 10 ;
}

catch(ArrayOutOfBounds aoob) {
    cout << '\n' ;
    cout << aoob << " (index, value): " << aoob.index() << ", " << 10 << endl ;
}

cout << '\n' ;
return 0 ;
}
void setAt(int index, double value) {
    if (index < 0 || index >= values.size())
        throw ArrayOutOfBounds{index, value}; 
    values[index] = value;
}
ArrayElementProxy operator[](int index) {
    return ArrayElementProxy{*this, index};       
}

class ArrayElementProxy {
    Array* array_;
    int    index_;
public:
    ArrayElementProxy(Array& array, int index) : array_(&array), index_(index){}
    Array& operator=(double value){
        array_->setAt(index_, value);
        return *array_;
    }
    operator double() const{
        return array_->getAt(index_);
    }
};