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

21

11.03.2016, 14:01

Geht! :thumbsup:

Aber nun zum Kopierkonstruktor:
Ich habe Button.h um folgendes erweitert:

C-/C++-Quelltext

1
2
int FM_font_used_index;
FontManager *FM_Pointer;


FM_Pointer, FM_font_used_index werden im Konstruktor definiert

C-/C++-Quelltext

1
:FM_font_used_index(p_FM_index), FM_Pointer(&p_FM)


Mein Kopierkonstruktor sieht nun so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
Button::Button(const Button &otherButton)
    :active(otherButton.getActive())
{   
    m_text.setFont(*otherButton.FM_Pointer->FM_getFont(otherButton.FM_font_used_index)); // Es wird hier wieder ein Pointer auf das Font im Fontmanager gehohlt und dann zugewiesen
    m_text.setCharacterSize(otherButton.getSize());
    m_text.setPosition(otherButton.getPos());
    m_text.setString(otherButton.getString());
    m_text.setColor(otherButton.getColor());
}


Kann ich diesen soweit verwenden?

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »numbo« (11.03.2016, 15:50)


22

11.03.2016, 16:11

Ein Pointer vom Fontmanger im Button zu haben, spricht auch für kein schönes Design.

C-/C++-Quelltext

1
// Es wird hier wieder ein Pointer auf das Font im Fontmanager gehohlt und dann zugewiesen

Die Speicheradresse wo der Font liegt ist dem alten Button doch bekannt (auch ohne einen Pointer auf den FontManager), und wenn dieser Kopiert wird und die Adresse wieder aus dem FM geholt wird ist es immer noch die selbe Adresse wo der Font liegt.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

23

11.03.2016, 17:29

Also würde

C-/C++-Quelltext

1
 m_text.setFont(otherButton.getFont());

reichen?

24

12.03.2016, 06:03

It is important to note that the sf::Text instance doesn't copy the font that it uses, it only keeps a reference to it. Thus, a sf::Font must not be destructed while it is used by a sf::Text (i.e. never write a function that uses a local sf::Font instance for creating a text).


Bei deinem Ursprünglichen Problem, war das im Prinzip der Fehler. Du hast eine Lokale Instanze erstellet und zwar im Button selber. Dann eine Kopie erstellt (in den Vector "scheiben") und das Original wurde Zerstört damit auch die Referenz auf den Font.
Jetzt erstellst du den Font im FM und gibst an den Button nur noch eine Referenz raus (oder Pointer).

Also würde

C-/C++-Quelltext

1
 m_text.setFont(otherButton.getFont());

reichen?

Ich gehe sogar noch ein Schritt weiter und sage lass den selbst geschriebenen Kopierkonstruktor weg und lass den Compiler diese arbeit machen.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

25

12.03.2016, 14:09

Zitat

Ich gehe sogar noch ein Schritt weiter und sage lass den selbst geschriebenen Kopierkonstruktor weg und lass den Compiler diese arbeit machen.


Ich habe noch eine weitere Klasse, die von Button erbt(ButtonRectangle) siehe Git. Diese hat ihren eigenen Kopierkonstruktor, der wiederum den von Button aufruft.

Würde

C-/C++-Quelltext

1
2
3
4
5
ButtonRectangle::ButtonRectangle(const ButtonRectangle &otherBR)
{
    setButton(*otherBR.getButton());
    setShape(*otherBR.getShape());
}

reichen? Oder doch lieber so:

C-/C++-Quelltext

1
2
3
4
5
ButtonRectangle::ButtonRectangle(const ButtonRectangle &otherBR)
    :m_button(*otherBR.getButton())
{
    setShape(*otherBR.getShape());
}

26

12.03.2016, 14:42

Warum bist du der Meinung einen Kopierkonstruktor selbst implementieren zu müssen?

Und dann sind wir auch gleich wieder beim Softwaredesign.

Vererbung stellt eine "ist ein(e)"-Beziehung da. Jedes ButtonRectangle ist ein Button?

Oder sollte es eher sein, jeder Button hat ein Rectangle?

"Hat ein"-Beziehung ist dann ein simples Member der Klasse.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige