例如,我有一些Load()
函数的类。
class DB {
private:
pt_db *db;
public:
DB(const char *path);
Write(const char *path);
int Load(const char *path);
};
我希望从Load()
函数返回一些状态,具体取决于传递的参数。
例如:
Load(<correct path to the file with valid content>) // return 0 - success
Load(<non-existent path to file>) // return 1
Load(<correct file path, but the content of the file is wrong>) // return 2
然而我也担心:
类型安全 - 我的意思是我想返回一些只能用作状态代码的对象。
int res = Load(<file path>);
int other = res * 2; // Should not be possible
仅使用预定义值。使用int
我可以错误地返回其他一些状态,例如return 3
(让我们在Load()
函数中发现错误信息)以及我是否期望此错误代码将被传递:
int res = Load(<file path>);
if(res == 1) {}
else if (res == 2) {};
...
// Here I have that code fails by reason that Load() returned non-expected 3 value
使用最佳C ++ 11实践。
有人可以帮忙吗?
答案 0 :(得分:3)
枚举是返回状态的好方法,例如:
class Fetcher{
public:
enum FetchStatus{ NO_ERROR, INVALID_FILE_PATH, INVALID_FILE_FORMAT };
private:
FetchInfo info;
public:
FetchStatus fetch(){
FetchStatus status = NO_ERROR;
//fetch data given this->info
//and update status accordingly
return status;
}
};
另一种方法是使用例外
class Fetcher{
private:
FetchInfo info;
public:
void fetch(){
if file does not exist throw invalid file path exception
else if file is badly formatted throw invalid file format exception
else everything is good
}
使用枚举作为返回状态更多C方式,使用异常可能更多C ++方式,但它是一个选择问题。我喜欢enum版本,因为它的代码更少,而且在我看来更具可读性。