00001
00041 #ifndef _OBJECT_H
00042 #define _OBJECT_H
00043
00044 #include <iostream>
00045
00046 using std::ostream;
00047 using std::string;
00048
00049 namespace container {
00050
00081 class Object {
00082 public:
00083
00084 class Info;
00085
00086 const static Info * const TYPE_INFO;
00087
00088 protected:
00089
00090 Object();
00091 Object(const Object& orig);
00092
00093 public:
00094
00095 virtual ~Object();
00096
00097
00098
00099
00114 virtual ostream& renderState(ostream& os) const;
00115
00124 virtual const Info* typeInfo() const;
00125
00129 virtual Object* clone(bool deepCopy = false) const = 0;
00130
00131 protected:
00132
00133
00134
00141 static const Info* typeInfoFactory(const string& typeName);
00142
00143 public:
00144
00145
00146
00160 friend ostream & operator <<(ostream& os, const Object& object);
00161
00174 friend ostream & operator <<(ostream& os, const Object* object);
00175
00176 };
00177
00178
00179
00187 class Object::Info: public Object {
00188 public:
00189
00190 const static Info * const TYPE_INFO;
00191
00192 const string typeName;
00193
00194 private:
00195
00201 Info(const string& type_Name);
00202
00206 Info();
00207
00211 Info(const Info& orig);
00212
00213 public:
00214
00220 virtual ~Info();
00221
00222
00223
00224 virtual ostream & renderState(ostream& os) const;
00225
00229 virtual const Info* typeInfo() const;
00230
00231 private:
00235 virtual Object* clone(bool deepCopy = false) const;
00236
00237 public:
00238
00239
00240
00252 friend const Info* Object::typeInfoFactory(const string& typeName);
00253 };
00254
00255 }
00256 #endif