PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Copy- Konstruktor, operator= und ähnliches in VC++


Vertex
2005-04-02, 20:28:32
Visual C++ 6
OOP
vector aus der STL im Einsatz

also... mein Problem ist, dass ich irgendwie den operator= nicht hinbekomme...
an den roten Stellen sind eventuell Fehler

ich versuche mal so wenig wie möglich zu posten, um es nicht noch unübersichtlicher zu machen, als es so schon ist... fals was wichtiges fehlen sollte, bitte schreiben...

noch was zur kurzen Erklärung, um was es in dem Proggi geht: Es werden immer 3 Buchstaben in einem Objekt eines dynamischen Arrays hineingeschrieben... zusätzlich wird dabei noch die Position gespeichert... ebenfalls dynamisch, damit die 3 Buchstaben nicht mehr als ein Objekt verbrauchen...

meine Klasse:
class Buchstabi
{
protected:
char Bfolge[3]; //völlig uninteressant

public:
vector <int*> Positionen; //kritisch... bereitet mir beim Kopieren Kopfzerbrechen
Buchstabi(char *Buchstabenfolge=" ");
~Buchstabi();
void SetBfolge(char * Buchstabenfolge);
char GetBfolge0();
char GetBfolge1();
char GetBfolge2();
Buchstabi & operator=(Buchstabi &a); //operator=
Buchstabi (Buchstabi &a); //Copy Konstruktor

};

so erzeug ich mir dann ein nettes Array in meiner main... obwohl... eigentlich böses Array... ganz böses Array... http://www.forum-3dcenter.net/vbulletin/images/3dc/smilies/common/wink.gif
vector <Buchstabi*> Bfobj;

damit ich dann schön ein paar dynamische Objekte reinhauen kann...
Buchstabi *tempobjekt;
tempobjekt= new Buchstabi;
Bfobj.insert(Bfobj.end(),tempobjekt);

so haue ich neue Positionen rein: (Eh gleiches Prinzip wie beim Objekt)
int *temppositionen;
temppositionen = new int;
Bfobj[0]->Positionen.insert(Bfobj[0]->Positionen.end(),temppositionen);

so... jetzt hab ich ne schöne QuicksortFunktion, in der halt die Objekte ein bisschen kopiert werden...

int partition(vector <Buchstabi*> &array, int top, int bottom) //Keine Ahnung wie ich das Objektarray übergeben soll, da ich nicht mal weiß wie ich die in beim kopieren brauche
{
vector <Buchstabi*> temp;

...

temp = array[i]; //hier regt sich der Compiler auf: error C2679: Binaerer Operator '=' : Kein Operator definiert, der einen
//rechtsseitigen Operator vom Typ 'class Buchstabi *' akzeptiert (oder keine geeignete Konvertierung moeglich)

}

Meine Versuche zum operator= und zum Copy Konstruktor:
Buchstabi & Buchstabi::operator =(Buchstabi &a)
{
Bfolge[0]=a.GetBfolge0();
Bfolge[1]=a.GetBfolge1();
Bfolge[2]=a.GetBfolge2();

Positionen=a.Positionen;
return *this;
}

Buchstabi::Buchstabi (Buchstabi &a)
{

Bfolge[0]=a.GetBfolge0();
Bfolge[1]=a.GetBfolge1();
Bfolge[2]=a.GetBfolge2();

Positionen=a.Positionen;


}

bitte bitte bitte helft mir http://www.forum-3dcenter.net/vbulletin/images/3dc/smilies/common/bluesmile.gif

Trap
2005-04-02, 20:53:47
Dein Problem ist was ganz anderes:
vector <Buchstabi*> &array;
vector <Buchstabi*> temp;

temp = array[i];

array[i] ist ein Buchstabi*, temp ist ein vector<Buchstabi*>.

Mach aus temp auch ein Buchstabi* dann geht es wahrscheinlich.

Vertex
2005-04-02, 21:01:59
Dein Problem ist was ganz anderes:
vector <Buchstabi*> &array;
vector <Buchstabi*> temp;

temp = array[i];

array[i] ist ein Buchstabi*, temp ist ein vector<Buchstabi*>.

Mach aus temp auch ein Buchstabi* dann geht es wahrscheinlich. test

THX soweit hilft mir das mal weiter...

nur eins noch: ist array[i] deshalb Buchstabi*, da ich es als Referenz übergeben habe? also trotz dem vector Typ...

zeckensack
2005-04-02, 21:20:07
Der Copy-Konstruktor sollte eine const& als Parameter haben.
Der Operator = ebenfalls, und er sollte auch eine const& zurückgeben.

Trap
2005-04-02, 21:40:51
vector<T> hat einen operator[] der ein T zurückgibt, es hat nix mit per Referenz oder per Wert übergeben vom vector zu tun.

vector<int> a;
int t = a[0];

vector<void*> c;
void* t2 = c[0];

usw...

Vertex
2005-04-02, 22:34:58
Der Copy-Konstruktor sollte eine const& als Parameter haben.
Der Operator = ebenfalls, und er sollte auch eine const& zurückgeben.

etwa so? (was hat const in diesem Fall für einen Hintergrund? Dass ich die Elemente nicht unabsichtlich (?) Verändern kann während ich kopiere?)

const Buchstabi & Buchstabi::operator =(const Buchstabi &a)
{
Bfolge[0]=a.GetBfolge0();
Bfolge[1]=a.GetBfolge1();
Bfolge[2]=a.GetBfolge2();

Positionen=a.Positionen;

return *this;
}

Buchstabi::Buchstabi (const Buchstabi &a)
{

Bfolge[0]=a.GetBfolge0();
Bfolge[1]=a.GetBfolge1();
Bfolge[2]=a.GetBfolge2();

Positionen=a.Positionen;


}

error C2662: 'GetBfolge0' : this-Zeiger kann nicht von 'const class Buchstabi' in 'class Buchstabi &' konvertiert werden
Durch die Konvertierung gehen Qualifizierer verloren

KiBa
2005-04-02, 22:46:56
nur mal so als tip: der vc-7.1 compiler ist kostenlos erhältlich und läßt sich meines wissens auch in vs-6 integrieren. der 6er compiler ist gerade im bezug zur stl und der c++ standard-konformität einer der schlechtesten...

Vertex
2005-04-02, 22:53:56
nur mal so als tip: der vc-7.1 compiler ist kostenlos erhältlich und läßt sich meines wissens auch in vs-6 integrieren. der 6er compiler ist gerade im bezug zur stl und der c++ standard-konformität einer der schlechtesten...

tjo... zu spät... muss mich da jetzt aber leider mit dem auseinandersetzen...

micki
2005-04-03, 02:31:25
etwa so? (was hat const in diesem Fall für einen Hintergrund? Dass ich die Elemente nicht unabsichtlich (?) Verändern kann während ich kopiere?)


damit wohl sowas wie

(a=b)=c;

nicht geht



error C2662: 'GetBfolge0' : this-Zeiger kann nicht von 'const class Buchstabi' in 'class Buchstabi &' konvertiert werden
Durch die Konvertierung gehen Qualifizierer verloren
GetBfolge muss eine const function sein.

MfG
micki

Vertex
2005-04-03, 22:54:41
damit wohl sowas wie

(a=b)=c;

nicht geht


GetBfolge muss eine const function sein.

MfG
micki

THX

& THX@ALL nochmal

also warum ich const verwenden hab ich jetzt verstanden...

nur hilft den Rückgabewert von den Gefolge Funktionen in const zu ändern nichts:

const char GetBfolge0();
const char GetBfolge1();
const char GetBfolge2();

error C2662: 'GetBfolge0' : this-Zeiger kann nicht von 'const class Buchstabi' in 'class Buchstabi &' konvertiert werden
Durch die Konvertierung gehen Qualifizierer verloren
Der Fehler tritt weiterhin in der Zeile auf:
Bfolge[0]=a.GetBfolge0();

mir kommt es ja irgendwie so vor, als ob der den Rückgabewert der const Buchstabi & Buchstabi::operator =(const Buchstabi &a)
Funktion nicht als const annimmt und mit der & Erkennung hats vielleicht auch was

???

Jemand ne Idee

Vertex
2005-04-04, 00:12:53
ok... thx habs jetzt...

wusste nicht, dass des const nach hinten gehört...

char GetBfolge0() const;

hab mittlerweile auch schon rausgefunden, dass damit festgelegt wird dass die funktion nicht schreibend auf die variablen zugreift... trotzdem versteh ich das ned so ganz... ???

Grestorn
2005-04-04, 12:07:25
char GetBfolge0() const;

hab mittlerweile auch schon rausgefunden, dass damit festgelegt wird dass die funktion nicht schreibend auf die variablen zugreift... trotzdem versteh ich das ned so ganz... ???
Was verstehst Du daran nicht? const hinter der Methode bedeutet, dass die Methode selbst die Klasseninstanz nicht verändert.

In Methoden, die const sind, kannst Du keine nicht-const Methoden der selben Instanz aufrufen (denn die würden sie ja potentiell ändern) und keine Membervariablen verändern.

Wenn Du eine const Instanz einer Klasse hast, z.B.

const Buchstabi &bs;

dann kannst Du von bs nur const Methoden aufrufen, da sonst die Instanz potentiell verändert werden könnte, was ja durch die Deklaration verboten ist.