Referenzen und Konstruktoren
-
Guten Abend!
Ich habe ein Problem mit einer Referenz.
Ich habe in einer Klasse eine Referenz auf eine weitere Klasse als Eigenschaft:
cEnemy& AimedEnemy;Der Konstruktor der betroffenen Klasse sieht so aus:
cBullet::cBullet(double X, double Y, double AimX, double AimY, double Damage, cEnemy& Aim): AimedEnemy( Aim ) { ...Zur Information:
Innerhalb des Konstruktors wird AimedEnemy nichts zugewiesen und es wird auch nicht verwendet, falls so der auftretende Fehler verursacht wird.Diesen Konstruktor rufe ich in einer For Schleife genau einmal so auf:
cBullet tempBullet( iX * 2.0 / Map.iXCount - 1.0 + 1.0 / Map.iXCount, iY * 2.0 / Map.iYCount - 1.0 + 1.0 / Map.iYCount, Map.vEnemies[i].dX + 1.0 / Map.iXCount, Map.vEnemies[i].dY + 1.0 / Map.iYCount, dDamage, Map.vEnemies[i]); vBullets.push_back(tempBullet); return 0;Die betroffene Funktion ist eine int Funktion. Aber ich glaube nicht, dass das hier etwas zur Sache tut.
Beim Kompilieren (Entwicklungsumgebung Code::Blocks, Compiler GNU GCC Compiler, falls das wichtig ist) erhalte ich folgenden Fehler:
F:\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc|238|error: non-static reference member `cEnemy&cBullet::AimedEnemy', can't use default assignment operator|
Wo liegt hier mein Fehler? Ich werde aus dem Error, bzw. über Google und andere Suchmaschinen leider nicht schlau.
Sollte ich bestimmte, möglicherweise wichtige Code-Teile vergessen haben, bitte zögert nicht diese zu fordern.
Vielen Dank im Voraus für eure Hilfe.
MfG Magellan
-
Der Teil, wo du einen std::vector<cBullet> erstellst, wäre gut zu kennen.
-
Hallo und danke für deine Antwort.
Ganz oben verwende ich :
using namespace std;und die Funktion mit dem tempBullet ist die Funktion einer Klasse namens cTower, diese hat auch einen Member:
vector < cBullet > vBullets;Danke nochmal im Voraus
MfG Magellan
-
std::vector setzt voraus, dass die verwendete Klasse einen Default-Ctor und einen operator= hat, das ist bei dir scheinbar nicht der Fall.
-
Okay, ich seh das Problem. Folgendes Minimalbeispiel:
#include <vector> class A { public: A(int &x) : x(x) { } private: int &x; }; int main() { int x = 2; std::vector<A> v; v.push_back(A(x)); // Fehler hier. }Da A einen Referenzmember hat, kann der Compiler keinen Zuweisungsoperator (operator=) für dich erstellen, und da std::vector einen Werttyp braucht, der das Assignable-Konzept erfüllt (also einen solchen Operator hat, siehe 23.1 (3) im Standard), fliegt das ganze auseinander.
Nimm statt der Referenz halt einen Zeiger.
-
Danke, aber wenn ich einen Zeiger verwende, also
cEnemy* AimedEnemy;statt
cEnemy& AimedEnemy;usw.
dann erhalte ich bei
AimedEnemy.dLife -= dDamage;den Fehler
...\main.cpp|407|error: request for member `dLife' in `((cBullet*)this)->cBullet::AimedEnemy', which is of non-class type `cEnemy*'|
Das geschieht in einer Funktion von cBullet. dDamage ist eine Eingenschaft von cBullet.
Zur Information sollte ich aber auch sagen, dass ich zum erstem Mal mit Zeigern arbeite, weil ich gehört/gelesen habe, dass das keine besonders gute Arbeitsweise wäre...
Danke nochmal
MfG
-
...
AimedEnemy->dLife
-
...
(*AimedEnemy).dLife
-
Danke, mit beiden Varianten lässt sich das Projekt kompilieren.
Allerdings stürzt das Programm ab, egal welche der beiden Varianten ich verwende...
-
Wie genau stürzt es ab?
Überprüf doch (z.B. mit dem Debugger), ob der Zeiger
AimedEnemygültig ist. Hast du ihn initialisiert?
-
Hallo, bei
*AimedEnemy = Aim;stürzt er ab.
Wenn ich in die Zeile davor
exit(0);schreib beendet sichs korrekt.
In der Zeile danach, wird exit nicht erreicht.
ogl_c.exe funktioniert nicht mehr
Der Debugger sagt mir:
Process returned -1073741819 (0xC0000005)
Vielen Dank schonmal für deine Hilfe.
MfG
-
AimedEnemy scheint nicht gültig zu sein. Wo initialisierst du die Variable denn?
-
Magellan schrieb:
Hallo, bei
*AimedEnemy = Aim;stürzt er ab.
AimedEnemy = &Aim;*AimedEnemy = Aimwürde voraussetzen dassAimedEnemyvorher schon auf ein gültiges Objekt zeigt, und würde dann den Wert kopieren (operator = aufrufen), und nicht den Zeiger "verbiegen".
DaAimedEnemyvermutlich zu dem Zeitpunkt wo du das aufrufst nicht auf ein gültiges Objekt zeigt, crasht es eben.BTW: ich glaube "aimed" ist falsch in dem Zusammenhang (die Waffe ist "aimed" auf das Ziel, aber auf das Ziel kann man das Wort "aimed" glaube ich nicht anwenden). Ich bin mir nicht sicher, aber ich denke "targeted" könnte das richtige Wort sein.
-
Vielen Dank hustbaer!
Damit funktioniert es. Und auch danke für die hilfreiche Erklärung

PS:
Auch danke für dein BTW. Werd ich mir nochmal überlegen
MfG, und nochmal danke an alle
Magellan
-
hustbaer schrieb:
BTW: ich glaube "aimed" ist falsch in dem Zusammenhang (die Waffe ist "aimed" auf das Ziel, aber auf das Ziel kann man das Wort "aimed" glaube ich nicht anwenden). Ich bin mir nicht sicher, aber ich denke "targeted" könnte das richtige Wort sein.
Target könnte auch reichen
targeted heißt auch wieder "auf jmd/etw gerichtet", wäre also wieder die Waffe...
-
pumuckl schrieb:
hustbaer schrieb:
BTW: ich glaube "aimed" ist falsch in dem Zusammenhang (die Waffe ist "aimed" auf das Ziel, aber auf das Ziel kann man das Wort "aimed" glaube ich nicht anwenden). Ich bin mir nicht sicher, aber ich denke "targeted" könnte das richtige Wort sein.
Target könnte auch reichen
targeted heißt auch wieder "auf jmd/etw gerichtet", wäre also wieder die Waffe...Ja, Target würde reichen.
Ich glaube targeted geht für beides, es gibt auf jeden Fall "targeted by", also "to be targeted by someone" im Sinne von "von jemandem anvisiert werden".
"to be aimed by someone" gibt's auch, aber das bedeutet "von jemandem (auf ein Ziel) ausgerichtet werden", und nicht "von jemandem anvisiert werden".