1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| // interface
class Error {
public:
Error() : n_(0) {}
virtual ~Error() {}
virtual void print(ostream &) = 0; // par exemple
void used() { n_ += 1; }
void unused() { if (--n_ == 0) delete this; }
private:
int n_;
};
class Status {
public:
Status() : isok_(true), error_(0) {}
Status(Error * e) : isok_(false), error_(e) { e->used(); }
Status(const Status & st) {
isok_ = st.isok_;
if ((error_ = st.error_) != 0)
error_->used();
}
Status & operator=(const Status & st) {
if (&st != this) {
if (error_ != 0)
error_->unused();
isok_ = st.isok_;
if ((error_ = st.error_) != 0)
error_->used();
}
return *this;
}
~Status() { if (error_ != 0) error_->unused(); }
bool isOk() const { return isok_; }
const Error * error() const { return error_; }
void print(ostream & o) {
if (error_ != 0)
error_->print(o);
else
o << "ok" << endl;
}
private:
bool isok_;
Error * error_;
};
// un cas d'erreur
class Error1 : public Error {
public:
Error1(string s) : s_(s) {}
virtual void print(ostream & o) { o << s_ << endl; }
private:
string s_;
};
// un autre cas d'erreur
class Error2 : public Error {
public:
Error2(int v1, int v2) : v1_(v1), v2_(v2) {}
virtual void print(ostream & o) {
o << "value not between " << v1_ << " and " << v2_ << endl;
}
private:
int v1_;
int v2_;
};
// utilisation via des fonctions hadhoc pour exemple
Status f1(int v)
{
if (v < 0)
return Status(new Error1("the value is negative"));
return Status(); // ok
}
Status f2(int v)
{
Status r = f1(v);
if (! r.isOk())
return r;
if ((v >= 2) && (v <= 10))
return Status(); // ok
return Status(new Error2(2, 10));
} |
Partager