forked from liskin/xchat-bttrw
-
Notifications
You must be signed in to change notification settings - Fork 1
/
cloneable.h
43 lines (38 loc) · 1.11 KB
/
cloneable.h
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
#ifndef _CLONEABLE_H_INCLUDED
#define _CLONEABLE_H_INCLUDED
#include <stdexcept>
#include <typeinfo>
namespace std {
/**
* \brief The "clone not supported" exception. It means that the object of
* this type has not overloaded the clone method so it is not able to
* clone itself.
*/
class clone_not_supported : public logic_error {
public:
/**
* Contructor.
* \param classname The name of the class in question. Should be
* filled with classname from RTTI.
*/
explicit clone_not_supported(const string &classname)
: logic_error("Clone not supported by " + classname) { }
};
/**
* \brief A cloneable interface. Acts just like that in Java.
*/
class cloneable {
public:
/**
* Clone the object. This method, unless overloaded, just throws
* the clone_not_supported exception.
* \return Nothing, but generally the pointer to the cloned
* object.
*/
virtual cloneable * clone() {
throw clone_not_supported(typeid(*this).name());
}
virtual ~cloneable() { }
};
}
#endif /* _CLONEABLE_H_INCLUDED */