Referenzen und Konstruktoren



  • 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 AimedEnemy gü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 = Aim würde voraussetzen dass AimedEnemy vorher schon auf ein gültiges Objekt zeigt, und würde dann den Wert kopieren (operator = aufrufen), und nicht den Zeiger "verbiegen".
    Da AimedEnemy vermutlich 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".


Anmelden zum Antworten