union in Objekt klasse verwenden



  • hi,

    wie kann ich den konstruktor: U(const vector<int> &vec) implementieren?
    warum braucht das union hier einen konstruktor/destruktor, ich nehme an wegen dem vector?

    #include <iostream>
    #include <vector>
    using namespace std;
    
    enum class type {
    	vector_type,
    	integer_type
    };
    
    // Object can either be an Integer or Vector<Object> 
    class Object {
    public:
    	type type_;
    	union U {
    		vector<Object> vec_;
    		int num_;
    
    		U(const vector<int> &vec) {
    			//for (int i = 0; i < vec.size(); i++) {
    				//vec_.push_back(Object(i));
    			//}
    		}
    		U(int num): num_(num) {}
    
    		~U() {}
    	}u_;
    
    	Object(const vector<int> &vec): u_(vec),
    									type_(type::vector_type) {
    	}
    
    	Object(int num): u_(num), 
    	 				 type_(type::integer_type) {
    	}
    
    	~Object() {
    	}
    };
    
    int main() {
    	// to construct somth like that: [1,2, [3, [4,5], 6], 7]
    
    	Object o(vector<int>({1,2}));
    
    	return 0;
    }
    


  • Gar nicht. Eine Union darf keine Klassen enthalten.



  • wie dann?
    so?

    vector<Object*> vec_;
    

  • Mod

    tntnet schrieb:

    Gar nicht. Eine Union darf keine Klassen enthalten.

    Das ist Unsinn.

    warum braucht das union hier einen konstruktor/destruktor, ich nehme an wegen dem vector?

    Haargenau.



  • @Arcoth:
    ok, wie kann ich nun U(const vector<int> &vec) implementieren?

    so der vector vec_ und die integer variable num_ teilen sich den gleichen speicher und der compiler allokiert nimm den groessten datentyp, das muesste ja immer der vector sein?



  • Das Feature nennt sich Unrestricted Union und gibt es seit C++11. In deinem Konstruktor für den vector brauchst du ein Placement New um den Konstruktor des Vectors aufzurufen.



  • wie sieht der code fuer Placement New hier aus?



  • mein versuch:

    union U {
    		vector<Object> vec_;
    		int num_;
    
    		void *operator new(size_t, void *p) {
      			return p;
    		}
    
    		U(const vector<int> &vec) {
    			for (int i = 0; i < vec.size(); i++) {
    				vec_ = new ??
    			}
    		}
    		U(int num): num_(num) {}
    
    		~U() {}
    	}u_;
    


  • Hast du per Google kein Beispiel gefunden? Der eigene operator new kann weg. Das mit dem Placement New sieht so aus:

    U(const vector<int> &vec) {
      new(&vec_) vector<Object>();
      for (int i = 0; i < vec.size(); i++) {
        vec_.push_back(Object(i));
      }
    }
    

    Im Grunde ruft das nur den Konstruktor von deinem vector auf. Der Speicher ist ja schon vorhanden. Du brauchst jetzt aber noch einen Copy Constructor für deine Object Klasse wenn du sie in einen vector packen willst.



  • Das Konstrukt mit der Union sieht mir mächtig verdächtig aus. Wofür brauchst du das?


  • Mod

    sebi707 schrieb:

    Das Feature nennt sich Unrestricted Union und gibt es seit C++11.

    Klassen waren schon immer in Unions erlaubt, bis vor C++11 aber nur PODs.

    sebi707 schrieb:

    In deinem Konstruktor für den vector brauchst du ein Placement New um den Konstruktor des Vectors aufzurufen.

    Der Konstruktor kann ganz entspannt durch einen leeren Initializer aufgerufen werden 😕

    U(const vector<int> &vec) : vec_() {
      for (int i = 0; i < vec.size(); i++)
        vec_.push_back(Object(i));
    }
    


  • Arcoth schrieb:

    Klassen waren schon immer in Unions erlaubt, bis vor C++11 aber nur PODs.

    Ich hab ja gar nichts zu Klassen gesagt. Nur das er für sein Vorhaben mit std::vector in einer union C++11 braucht.

    sebi707 schrieb:

    Der Konstruktor kann ganz entspannt durch einen leeren Initializer aufgerufen werden 😕

    Oh, das ist nett. In den Beispielen die ich per Google gefunden habe tauchte das nicht auf...



  • ich hab den code mal hier gepostet, wo liegt hier noch das problem?
    http://ideone.com/MwcMf5



  • Wenn man sowas sieht, fragt man sich ob du das Konzept von union verstanden hast:

    U(U &other) {
      vec_ = other.vec_;
      num_ = other.num_;
    }
    

    Die Union ist nur eins von beidem, nicht beides gleichzeitig!

    Zu deinem Code, du brauchst das komplette Programm an Standard Funktionen: Default Constructor, Copy Contructor und Assignment Operator.
    So müsste es gehen: http://ideone.com/4LkBWe
    Vielleicht kann man den doppelten Code bei Copy Constructor und Assignment Operator noch irgendwie loswerden, mir ist aber gerade nicht eingefallen wie.

    Warum machst du dir überhaupt diese Arbeit mit der Union? Wenn du einfach den int und vector als Member nehmen würdest, wäre deine Klasse irgendwie 4 Byte Größer, aber dafür alles deutlich einfacher.



  • @sebi707:

    U(U &other) {
      vec_ = other.vec_;
      num_ = other.num_;
    }
    

    ich weiss das sowas keinen sinn hat bei einem union. ich wollte den code nur mal schnell kompilieren ohne fehler.

    ich wollte nur mal sehen wie ich hier das union verwenden kann. der code ist auch kein production code sondern um unions zu lernen etc. und um sowas zu erstellen: [1,2, [3, [4,5], 6], 7]
    1,2 sind integer
    [3, [4,5], 6] ist ein vector von objects...



  • wo ich dann das Object o so erstellen moechte:

    Object o1(vector<int>({1,2}));
      Object o2(vector<int>({3}));
      Object o3(vector<int>({4,5}));
      Object o4(vector<int>({6}));
      Object o5(vector<Object>({o2,o3,o4}));
      Object o6(vector<int>({7}));
    
      Object o(vector<Object>({o1,o5,o6}));
    


  • Den von mir verlinkten Code hast du gesehen? Da fehlt ja nur noch der Constructor der vector<Object> nimmt, dann geht alles. Wozu das gut sein soll frage ich mich allerdings immer noch. Baumstruktuoren kann man auch anders hinkriegen und std::vector mit int in einer union hatte ich bisher auch noch nicht gebraucht.



  • so funktionierts nun (ohne union):
    http://ideone.com/MwcMf5

    ich wollte zum spass dazu eine recursive funktion implementieren welche mir die summe berechnet...

    der sinn der aufgabe ist etwas c++ zu ueben...
    wenn ich meine version in die union version umbaue, dann wird der code wesentlich groesser... das habe ich nicht erwartet...



  • hier eine bessere version, welches java object aehnlich kommt?
    http://ideone.com/ynvnyz


Log in to reply