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

06.03.2016, 20:33

SFML Zugriffsverletzung beim Lesen

Ich bin gerade dabei ein Spiel zu erstellen.
Ich habe die Klasse Button erstellt und 3 Objekte davon in eine Vector in MainMenuState.cpp(im Konstruktor) gespeichert.
Wenn man folgende Zeilen auskommentiert kommt der Zugriffsverletzungsfehler:

C-/C++-Quelltext

1
2
3
m_buttons[0].setFont("assets//font//arial.ttf");
m_buttons[1].setFont("assets//font//arial.ttf");
m_buttons[2].setFont("assets//font//arial.ttf");

Dies ist aber eigentlich das selbe, das der Konstruktor in "Button.cpp" macht, deshalb wundert es mich warum die Fehlermeldung überhaupt zu stande kommt.Liegt das vielleicht an einer falschen Reihenfolge der Funktionsaufrufe?
Achso, der Fehler tritt erst beim Zeichen der Texfelder auf und die Fonts werden ohne Fehlermeldung geladen.

Hier das Projekt auf Github : TowerDefense

Schon mal danke für alle Antworten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

06.03.2016, 22:01

Du kopierst den Button, damit den Text und den Font. Dabei werden alle Deine Referenzen ungültig. Bitte beschäftige Dich mit dem Thema Pointer und Referenzen, damit das Problem deutlich wird. Es verhält sich dabei ähnlich wie hier erklärt:
https://www.spieleprogrammierer.de/wiki/…insteiger-Tipps
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]

3

06.03.2016, 23:55

Du kopierst den Button, damit den Text und den Font. Dabei werden alle Deine Referenzen ungültig.


Wird in dem Vector nicht ein neues Object der Klasse Button gespeichert? An welcher Stelle wird der Kopierkonstruktor aufgerufen?
Bitte berichtige mich, wenn ich falsch liege.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

07.03.2016, 08:00

Es wird ein neues Objekt in den Vektor gepackt, ja. Also nicht das Original. Folglich muss es ja kopiert werden, denn sonst wäre ja unklar, woher die Daten kommen sollen. Zudem kann ein Vector beim Hinzufügen neuer oder entfernen bestehender Elemente die anderen umkopieren. Und damit tritt das Problem so oder so wieder auf.
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]

5

08.03.2016, 14:01

Ich habe jetzt unique_ptr beim erstellen im Vector genommen.
Sind die Klassen nun ok?

Hier nochmal das Projekt auf Git: TowerDefense

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

08.03.2016, 14:15

Nun ja, das eigentliche Problem bleibt bestehen, ein Button ist kopierbar, wird aber inkorrekt kopiert, falls man das tut. Du hast das jetzt umschifft, dass er kopiert wurde. Ich würde (auch dazu steht ein Sample im Wiki-Link) entweder so weit gehen den ganzen Button non-copyable zu machen oder eben seinen Kopier-Konstruktor entsprechend anzupassen. Ich würde Dir ohnehin dazu raten, Fonts nicht innerhalb der Button-Klasse zu laden, sonst hast Du 10 Buttons und lädst damit auch 10mal den Font.
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

08.03.2016, 16:29

Erstmal vielen Dank für die schnellen Antworten!
Ich habe nun einen Kopierkonstruktor erstellt :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Button::Button(Button &otherButton)
{
    m_text.setFont(otherButton.getFont());
    m_text.setCharacterSize(otherButton.getSize());
    m_text.setPosition(otherButton.getPos());
    m_text.setString(otherButton.getString());
    m_text.setColor(otherButton.getColor());
}

"const" konnte ich hier nicht verwenden, da ich auf die Funktionen der "otherButton" Klasse Zugriff benötige.
Stimmt der Konstruktor soweit?
Ich habe auch über eine "non-copyable" Button-Klassse nachgedacht, finde aber leider keine Beispiele, dies umzusetzen. Hättest du vielleicht einen Link parat?

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

8

08.03.2016, 16:57

"const" konnte ich hier nicht verwenden, da ich auf die Funktionen der "otherButton" Klasse Zugriff benötige.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
class Foo {
private:
  int i = 0;
  
public:
  Foo(){};
  Foo(const Foo& foo){i = foo.getI();};

  void setI(int _i) {i = _i;};
  int getI() const {return i;};
};


Einen Link zur Realisierung von NonCopyable hat BC schon geposted.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

9

08.03.2016, 17:31

Ganz vergessen, jetzt funktionierts :)
Danke

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

08.03.2016, 20:00

Stimmt der Konstruktor soweit?
Nein. Das Problem ist, dass Du noch immer den anderen Font verwendest. Wird der andere Button aber zerstört, ist der Font weg und ungültig. Du bist noch immer da, wo Du vorher warst. Das da hätte der Compiler vermutlich sogar besser implementiert, weil Du nur ein paar Member von m_text kopierst. Du hättest da auch gleich m_text = otherButton.m_text; schreiben können. Ein Kopierkonstruktor muss natürlich *alles* kopieren und nicht nur Teile.
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]

Werbeanzeige