mehrdeutiger oder nicht vorhandener Kopierkonstruktor

Allgemeine Diskussion mehrdeutiger oder nicht vorhandener Kopierkonstruktor

  • Mittwoch, 9. Mai 2012 21:45
     
      Enthält Code

    Hallo,

    mein Programm lief für kleine Zahlen ohne CLI, allerdings kam es bei größeren zahlen zu HEAP-Errors.

    Also brauch ich ne Garbage-Collection und deshalb CLI :)

    Naja und das krieg ich einfach nich hin...

    Ich habe eine Klasse, die große Binärzahlen definiert und eine Header-Datei die diverse Berechnungen implementiert.

    Rufe ich jetzt in einer Berechnung eine Klassenmethode auf, der eine andere Klasseninstanz übergeben wird, bekomme ich folgenden Fehler:

    Konvertierung des Parameters 1 von 'BigBin' in 'BigBin' nicht möglich
    Konstrukt-class "BigBin" kann aufgrund eines mehrdeutigen oder nicht verfügbaren Kopierkonstruktors nicht kopiert werden.

    Hier die Klasse: (Im Mom auskommentiert mein Versuch eines Kopierkonstruktors)

    #pragma once
    
    ref class BigBin
    {
    public:
    	//Funktionen
    	short bigger(BigBin B); //Welche Zahl ist größer? 0 = B, 1 = A, 2 = A und B  sind gleich
    	void create(int* bits); //Erstellen: Erzeugt Zufallszahl mit angegebener Länge
    	//Eigenschaften
    	int groesse; //Gibt an, mit wie vielen Bits die Zahl dargestellt werden kann
    	cli::array<short>^Zahl; //Array mit den binären Einträgen der Zahl
    	bool Neg; //Gibt an, ob die Zahl negativ ist
    	
    	/*//Constructor
    	BigBin(){
    		Neg = false;
    	}
    	
    	//copyConstructor
    	BigBin(const BigBin^ Bbc){
    		*this = Bbc;
    	}
    	
    	//AssignmentOperator Overload
    	BigBin^ operator =(const BigBin^ Bbc){
    		if(this == Bbc)
    			return this;
    		//copy
    		groesse = Bbc->groesse;
    		Zahl = Bbc->Zahl;
    		Neg = Bbc->Neg;
    
    		return this;
    	}*/
    
    	//Destructor
    	~BigBin(){
    		this->!BigBin();
    	}
    	
    	//Finalizer
    	!BigBin(){
    		delete [] Zahl;
    	}
    };

    Und hier die problematische Klassenmethode:

    short BigBin::bigger(BigBin B)
    {
    	int i; //Zähler
    
    	//ist eine Zahl negativ?
    	if(Neg == true && B.Neg == false) return 0;
    	if(Neg == false && B.Neg == true) return 1;
    	
    	//Eine Zahl ist größer als die andere, wenn sie an der höheren Position eine 1 stehen hat:
    	if(groesse < B.groesse) return 0;
    
    	if(groesse > B.groesse) return 1;
    
    	if(groesse == B.groesse)
    	{
    		for(i=groesse-1; i>=0; i--)
    		{
    			if(Zahl[i] < B.Zahl[i]) return 0;
    			if(Zahl[i] > B.Zahl[i]) return 1;
    		}
    	}
    
    	return 2;
    
    }

    Und hier der Coder der den Fehler verursacht:

    BigBin suba(BigBin A, BigBin B) //Subtraktion Ausgabe = A - B
    {
    	int i; //Zähler
    	bool Ueber; //Gibt an, ob es einen Übertrag in die nächste Spalte gibt
    	BigBin Erg; //Zwischenspeicher für das Ergebnis
    	BigBin Tmp; //Zwischenspeicher für Variablentausch wenn unterschiedliche Vorzeichen
    	
    	Erg.groesse = A.groesse; //das Ergebnis hat maximal die gleiche Grössenordnung, wie A
    	Erg.Zahl = gcnew cli::array<short>(Erg.groesse);
    
    	if(B.bigger(A) == 1) //<---FEHLER
    	{
    		Erg.Neg = true;
    		Tmp = B;
    		B = A;
    		A = Tmp;
    	}
    	else
    //...

    Ich hoffe mir kann jemand helfen, bzw. erklären wie ich jetzt mit eigenen Klassen und Methodenaufrufen umgehen muss :)

Alle Antworten