mehrdeutiger oder nicht vorhandener Kopierkonstruktor
-
Mittwoch, 9. Mai 2012 21:45
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 :)
- Typ geändert Robert BreitenhoferMicrosoft Contingent Staff, Owner Freitag, 18. Mai 2012 13:36 Frage
- Typ geändert Robert BreitenhoferMicrosoft Contingent Staff, Owner Freitag, 15. Juni 2012 14:45 Keine Rückmeldung des Fragenstellender
Alle Antworten
-
Donnerstag, 10. Mai 2012 07:42
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 :)Die Logik versteht wer will... ich nicht...
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.
ref class BigBin
Du solltest Dir vor Augen führen, was "ref" bedeutet... vermutlich wolltest Du "value" verwenden...
Aber ich Rate Dir: Verwende kein C++/CLI sondern normales C++ und lass das "ref" oder "value" einfach weg, dannn macht es vermutlich das, was Du willst....
Jochen Kalmbach (MVP VC++) -
Freitag, 15. Juni 2012 14:45Besitzer****************************************************************************************************************
Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
****************************************************************************************************************Robert Breitenhofer, MICROSOFT

Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

