Redian新闻
>
关于 exception 的一个问题
avatar
关于 exception 的一个问题# Programming - 葵花宝典
r*r
1
中定义了 class exception:
class exception
{
public:
exception() throw() { }
virtual ~exception() throw();
virtual const char* what() const throw();
};
问题: 为什么 what() 返回一个 const char * 类型?
为什么不返回一个 string 呢? 可以返回一个 string 吗?
avatar
t*t
2
what if string throw another exception?

【在 r*********r 的大作中提到】
: 中定义了 class exception:
: class exception
: {
: public:
: exception() throw() { }
: virtual ~exception() throw();
: virtual const char* what() const throw();
: };
: 问题: 为什么 what() 返回一个 const char * 类型?
: 为什么不返回一个 string 呢? 可以返回一个 string 吗?

avatar
r*r
3
但是 logic_error 和 runtime_error 都有 data member 是 string 类型.
也就是说你 throw 一个 runtime_error object 时, 要作 string 的 copy
construction,
这样也有可能 throw another exception
avatar
t*t
4
well, the standard only says the interface (there's no obligation on data
members). implementation can do whatever they like to do...

【在 r*********r 的大作中提到】
: 但是 logic_error 和 runtime_error 都有 data member 是 string 类型.
: 也就是说你 throw 一个 runtime_error object 时, 要作 string 的 copy
: construction,
: 这样也有可能 throw another exception

avatar
r*r
5
well, the standard says logic_error's interface is like this:
class logic_error : public exception
{
public:
explicit logic_error(const string& __arg);
}
hard to imagine an implementation that can actually avoid copying __arg.
can you?
avatar
t*t
6
no, i can't explain now. hehe.

【在 r*********r 的大作中提到】
: well, the standard says logic_error's interface is like this:
: class logic_error : public exception
: {
: public:
: explicit logic_error(const string& __arg);
: }
: hard to imagine an implementation that can actually avoid copying __arg.
: can you?
:

avatar
r*r
7
i came up with an idea: define a char * data member x;
and do the following in the constructor:
x = (char *)malloc(__arg.size());
strcpy(x, __arg.c_str());
and return x in what(), and call free(x) in the destructor.
maybe that works, at least it's guaranteed that no additional exception will
be thrown.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。