Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.01.2016, 22:01

C++ SFML Error: 'ShotManager::ShotManager(void)': attempting to reference a deleted function SpaceShooter

Ich versuche gerade in meinem Space Shooter eine ShotManager klasse zu schreiben aber der Kompiller spuckt immer wegen den Konstruktor diese Fehlermeldung aus Error: 'ShotManager::ShotManager(void)': attempting to reference a deleted function SpaceShooter

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "ShotManager.hpp"

void ShotManager::Spawn(float PosX, float PosY) {

    Bullet *Bu = new Bullet;

    Bu->Init(PosX, PosY);

    List.push_back(Bu);

}

void ShotManager::CheckBullet() {

    for (auto It = List.begin(); It != List.end(); It++) {

        if ((*It)->Sprite.getPosition().y < 200) {

            delete (*It);
            It = List.erase(It);

        }

    }

}

void ShotManager::Update(float ElapsedTime) {

    CheckBullet();

    for (auto &It : List) {

        (*It).Update(ElapsedTime);

    }

    if (Keyboard::isKeyPressed(Keyboard::Space)) {

        Spawn(Player.Sprite.getPosition().x, Player.Sprite.getPosition().y);

    }

}

void ShotManager::Render(RenderWindow &Window) {

    for (auto &It : List) {

        (*It).Render(Window);

    }

}

2

28.01.2016, 22:27

Erstmal alles gute zum 18.
Wie sieht die Deklaration aus?

MfG
Check

3

28.01.2016, 22:40

Danke :)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#pragma once

#include <SFML/Graphics.hpp>
#include <list>

#include "Bullet.hpp"
#include "Player.hpp"

using namespace sf;
using namespace std;

class ShotManager {

public:
    void Spawn          (float PosX, float PosY);
    void CheckBullet    ();
    void Update         (float ElapsedTime);
    void Render         (RenderWindow &Window);

private:
    list<Bullet*>       List;
    Clock               Clock;

    Player              Player;

};


mfg N4SONIC

4

28.01.2016, 23:04

Hat zwar nicht speziell mit dem Thema zu tun aber mache niemals "using namespace" Anweisungen im Header file. Bringt die später in teufels Küche. Der namespace existiert nicht umsonst.
Das andere ist, du solltest statt RawPtr besser std::unique_ptr nutzen (für deine Bullet list). Das nimmt dir schonmal das memory Management ab, sodass du keine memory lecks bekommst. Weil so hast du definitiv eins.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

29.01.2016, 01:18

Was ist SpaceShooter für ein Typ und wo kommt der da drin vor?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

29.01.2016, 06:35

Er hat nicht nur Memory-Leaks, er hat auch einen potentiellen Crash in CheckBullet, wenn er versucht die letzte Kugel in der Liste zu entfernen. Entfernt er andere, hat er einfach nur einen Bug, weil er dabei eine Kugel überspringt.

Bezüglich dots Frage ist vermutlich die Deklaration von Player der Schlüssel - klingt als würde dort eine Forward-Declaration von SpaceShooter als Member deklariert oder ähnliches (oder es steckt sogar noch tiefer, je nachdem, was Player selbst genau benutzt).
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

29.01.2016, 07:11

Ich habe jetzt im Code das using namespace entfernt und habe statt RawPointer jetzt std::unique_ptr verwendet aber ich bekomme eine Fehlermeldung ? Error C2280 'std::unique_ptr<Bullet,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function SpaceShooter c:\spiele und programme\visual express\vc\include\xmemory0 655

Und das SpaceShooter ist der Projektname.

Und wie schaffe ich es das er immer nur die Letzte Bullet zu zerstören ?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#pragma once

#include <SFML/Graphics.hpp>
#include <list>
#include <memory>

#include "Bullet.hpp"
#include "Player.hpp"

class ShotManager {

public:
    void Spawn                              (float PosX, float PosY);
    void CheckBullet                        ();
    void Update                             (float ElapsedTime);
    void Render                             (sf::RenderWindow &Window);

private:
    std::list<std::unique_ptr<Bullet>>      List;
    sf::Clock                               Clock;

    Player                                  Player;

};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "ShotManager.hpp"

void ShotManager::Spawn(float PosX, float PosY) {

    std::unique_ptr<Bullet> Bu;

    Bu->Init(PosX, PosY);

    List.push_back(Bu);

}

void ShotManager::CheckBullet() {

    for (auto It = List.begin(); It != List.end(); It++) {

        if ((*It)->Sprite.getPosition().y < 200) {

            (It)->reset();
            It = List.erase(It);

        }

    }

}

void ShotManager::Update(float ElapsedTime) {

    CheckBullet();

    for (auto &It : List) {

        (*It).Update(ElapsedTime);

    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) {

        Spawn(Player.Sprite.getPosition().x, Player.Sprite.getPosition().y);

    }

}

void ShotManager::Render(sf::RenderWindow &Window) {

    for (auto &It : List) {

        (*It).Render(Window);

    }

}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

29.01.2016, 07:13

List.push_back(Bu);
Das geht so nicht. Du musst "Bu" (sehr schlechter Name übrigens, warum es nicht "bullet" heißt, is mir unklar - wobei bei dir alles mit Großbuchstaben anfängt, was dann wohl der Grund für diesen schlechten Namen sein dürfte) mit std::move verschieben. Ansonsten wird versucht es zu kopieren und das geht mit unique_ptr (absichtlich) niicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

29.01.2016, 07:23

Wäre es Besser wenn ich zum Beispiel die ShotManager Klasse so definieren würde

C-/C++-Quelltext

1
ShotManager shotManager
?

Habe es gemacht aber der Error ist immer noch da.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "ShotManager.hpp"

void ShotManager::Spawn(float PosX, float PosY) {

    std::unique_ptr<Bullet> bullet;

    bullet->Init(PosX, PosY);

    List.push_back(std::move(bullet));

}

void ShotManager::CheckBullet() {

    for (auto It = List.begin(); It != List.end(); It++) {

        if ((*It)->Sprite.getPosition().y < 200) {

            (It)->reset();
            It = List.erase(It);

        }

    }

}

void ShotManager::Update(float ElapsedTime) {

    CheckBullet();

    for (auto &It : List) {

        (*It).Update(ElapsedTime);

    }

    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) {

        Spawn(Player.Sprite.getPosition().x, Player.Sprite.getPosition().y);

    }

}

void ShotManager::Render(sf::RenderWindow &Window) {

    for (auto &It : List) {

        (*It).Render(Window);

    }

}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

29.01.2016, 10:31

Wie sieht deine Player Klasse aus?


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void ShotManager::Spawn(float PosX, float PosY) {

    std::unique_ptr<Bullet> bullet;

    bullet->Init(PosX, PosY);

    List.push_back(std::move(bullet));

}

Darüber solltest du nochmal nachdenken... ;)

Werbeanzeige