Kopierkonstruktor Problem



  • Hab hier folgenden Konstruktor. Ein Set besteht aus n-SetMembern die über einen Pointer in einem SetMember-Array gespeichert werden.

    Nun krieg ich bei der Erzeugung der SetMember Objekte aber einen kompilerfehler wenn ich es "in einer zeile versuch":
    Es wird scheinbar versucht einen Kopierkonstruktor für SetMember(SetMember) aufzurufen, den es nicht gibt (wieso?), eig. müsste der existierene Konstruktor von Setmember mit int-parameter aufgerufen werden

    m_elements[i] = SetMember(va_arg(vl,int))  //geht net
    
    SetMember t(va_arg(vl,int));  //so läufts
    		m_elements[i] = t;
    

    hier mal die Konstruktor wo das Set Erzeugt wird.

    Set::Set(int c, ...)
    {
    	m_count = c;
    
    	va_list vl;
    	va_start(vl, c);
    
    	m_elements = new SetMember[c];
    
    	for(int i=0; i < c; i++)
    	{
    		SetMember t(va_arg(vl,int));  /* Warum nur so */
    		m_elements[i] = t;            /* über diesen Umweg */
    		//m_elements[i] = SetMember(va_arg(vl,int)); /* und nicht so ? */
    	}	
    	va_end(vl);
    }
    
    SetMember::SetMember(int x) //dieser Konstruktor sollte beide male aufgerufen werden
    {
    	m_val = x;
    	m_kanElement = this;
    }
    

    Hoffe die Infos reichen, kann mir jemand sagen was da falsch läuft ?



  • zuweisungs-operator??????



  • mein zuweisungsoperator sieht so aus:

    SetMember & SetMember::operator=(const SetMember & rhs)
    {
    	printf("SetMember Assignmentoperator\n");
    	m_val = rhs.m_val;
    	m_kanElement = this;
    
    	return *this;
    }
    

    is da falsch?



  • sollte der Kopy-ctor nich so ausehen

    SetMember::SetMember(const SetMember &scr) //dieser Konstruktor sollte beide male 
    
    m_val= scr.m_val;
    ....
    }
    


  • Dies:
    SetMember t(va_arg(vl,int)); //so läufts
    m_elements[i] = t;

    sollte gleichbedeutend sein mit:

    SetMember m_elements[i] (va_arg(v1, int));



  • Sorry, das war natürlich Blödsinn!



  • jokisd schrieb:

    m_elements = new SetMember[c];

    for(int i=0; i < c; i++)
    {
    SetMember t(va_arg(vl,int)); /* Warum nur so /
    m_elements[i] = t; /
    über diesen Umweg /
    //m_elements[i] = SetMember(va_arg(vl,int)); /
    und nicht so ? */
    }
    }[/cpp]

    Neuer Versuch:
    Ich habe das mal mit einem kleinen Beispiel nachgestellt. Bei mir funktionieren wie erwartet beide Wege. Der Kopierkonstruktor wird nicht benötigt. Es wird der passende überladene Konstruktor aufgerufen, der Zuweisungsoperator und der Destruktor. Das ist bei beiden Alternativen so.


Anmelden zum Antworten