fork download
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. using namespace std;
  5. using namespace std;
  6.  
  7.  
  8. class Node {
  9. private:
  10.  
  11. public:
  12. string name;
  13. Node *parent;
  14. vector <Node*> children;
  15.  
  16.  
  17. Node() { name = "noname", parent = NULL; }
  18.  
  19. Node(string _name) { name = _name, parent = NULL; }
  20.  
  21. Node(Node *_parent) { parent = _parent; }
  22.  
  23. Node(string _name, Node *_parent) { name = _name, parent = _parent; }
  24.  
  25. Node(Node *_parent, vector <Node*> _children) { parent = _parent, children = _children; }
  26.  
  27. Node(string _name, Node *_parent, vector <Node*> _children) { name = _name, parent = _parent, children = _children; }
  28.  
  29. virtual ~Node() { cout << "Base Destructor called\n"; }
  30.  
  31.  
  32. void add_parent(Node *wsk) {
  33. parent = wsk;
  34. }
  35.  
  36. void add_children(Node *child) {
  37. children.push_back(child);
  38. }
  39.  
  40. void info_node() {
  41. cout << "Name: " << name << endl;
  42. cout << "Address: " << this << endl;
  43. cout << "Parent: " << parent << endl;
  44. }
  45.  
  46. };
  47.  
  48.  
  49. class A {
  50. private:
  51. string name;
  52. int parameter_a;
  53. protected:
  54.  
  55. A() { name = "untitled"; parameter_a = 1; }
  56. A(string _name) { name = _name, parameter_a = 1; }
  57. A(string _name, int _parameter_a) : name(_name), parameter_a(_parameter_a) {};
  58.  
  59. string info_name() {
  60. return name;
  61. }
  62.  
  63. int info_parameter_a()
  64. {
  65. return parameter_a;
  66. }
  67.  
  68. public:
  69.  
  70. char info_type() {
  71. return 'A';
  72. }
  73.  
  74. friend class Leaf;
  75. friend A* search_recurs_node(Node* root, string name);
  76. virtual void info() = 0;
  77. };
  78.  
  79.  
  80. class Leaf : public Node {
  81. private:
  82.  
  83. public:
  84. vector<A*> objects;
  85. Leaf() { name = "noname", parent = NULL; }
  86.  
  87. Leaf(string _name) { name = _name, parent = NULL; }
  88.  
  89. Leaf(Node *_parent) { parent = _parent; }
  90.  
  91. Leaf(string _name, Node *_parent) { name = _name, parent = _parent; }
  92.  
  93. Leaf(Node *_parent, vector <Node*> _children) { parent = _parent, children = _children; }
  94.  
  95. Leaf(string _name, Node *_parent, vector <Node*> _children) { name = _name, parent = _parent, children = _children; }
  96.  
  97. void add_objects_leaf(A* obj) {
  98. objects.push_back(obj);
  99. }
  100.  
  101. };
  102.  
  103.  
  104. class X : public A, public Leaf {
  105. private:
  106. int parameter_x;
  107. public:
  108. X() : A("dziedziczone_w_X_z_A", 98), parameter_x(99) {};
  109. X(string _name_x, int _parameter_a, int _parameter_x) : A(_name_x, _parameter_a), parameter_x(_parameter_x) {};
  110.  
  111.  
  112. char info_type() {
  113. return 'X';
  114. }
  115.  
  116.  
  117. void info() {
  118. cout << "Name: " << A::info_name() << endl;
  119. cout << "Parameter_a : " << A::info_parameter_a() << endl;
  120. cout << "Parameter_d : " << parameter_x << endl;
  121. }
  122.  
  123.  
  124.  
  125. };
  126.  
  127.  
  128.  
  129. A* search_recurs_node(Node* root, string name) {
  130.  
  131.  
  132. A* result;
  133. Leaf* rzutowanie;
  134.  
  135. if ((root->children.size()) > 0) {
  136. for (int i = 0; i < (root->children.size()); ++i) {
  137.  
  138. auto a= search_recurs_node(root->children[i], name);
  139. if (a) return a;
  140.  
  141. }
  142. }
  143. else if (rzutowanie = dynamic_cast<Leaf*>(root)) {
  144. for (int i = 0; i < rzutowanie->objects.size();++i) {
  145. if (rzutowanie->objects[i]->info_name() == name) {
  146. cout << "W Funkcji search: " << endl;
  147. rzutowanie->objects[i]->info();
  148. cout << endl << "adres rzutowanie: " << rzutowanie->objects[i] << endl;
  149. result = (rzutowanie->objects[i]);
  150. cout << "adres result: " << result << endl;
  151. cout << endl;
  152. return result;
  153. }
  154. }
  155. }
  156.  
  157. cout <<"OOUPS!!!!!!!"<<endl;
  158. return nullptr;
  159.  
  160. };
  161.  
  162. int main()
  163. {
  164. //
  165.  
  166. Node A_node("node_A");
  167. Leaf X_node("node_X", &A_node);
  168.  
  169. A_node.add_children(&X_node);
  170.  
  171. X obj1("name d1", 1, 2), obj2("zmiana2d", 5, 6);
  172.  
  173. X_node.add_objects_leaf(&obj1);
  174. X_node.add_objects_leaf(&obj2);
  175.  
  176.  
  177. A* s_r;
  178. s_r = search_recurs_node(&A_node, "zmiana2d");
  179.  
  180. cout << "main: " << endl;
  181. cout << "adres obj2: " << &obj2 << endl;
  182. cout << "adres s_r: " << s_r << endl;
  183. X* x_r = dynamic_cast<X*>(s_r);
  184.  
  185. if (x_r)
  186. cout << "adres x_r: "<<x_r<<endl;
  187. else cout << "couldn't cast"<<endl;
  188.  
  189. s_r->info();
  190.  
  191. cout << endl << "The cause of 90% of programming errors sits in front of the screen" << endl;
  192.  
  193. return 0;
  194. }
Success #stdin #stdout 0s 3476KB
stdin
Standard input is empty
stdout
W Funkcji search: 
Name: zmiana2d
Parameter_a : 5
Parameter_d : 6

adres rzutowanie: 0xfff2d7ec
adres result: 0xfff2d7ec

main: 
adres obj2: 0xfff2d7ec
adres s_r: 0xfff2d7ec
adres x_r: 0xfff2d7ec
Name: zmiana2d
Parameter_a : 5
Parameter_d : 6

The cause of 90% of programming errors sits in front of the screen
Base Destructor called
Base Destructor called
Base Destructor called
Base Destructor called