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

16.10.2014, 20:26

C++ Class in Struct , kann ich der Class einen wert Übergeben bei der Struct erstellung? [gelöst]

Thread Titel viel mir kein besserer ein, mir fällt nichts ein wie ich es besser und kürzer Ausdrücken könnte.

Ich wollte mir eine Klasse in einem Struct erstellen. Die Klasse bräuchte aber einen Wert der bei der Erstellung übergeben werden sollte. Funktioniert das überhaupt und wenn ja wie kann ich bei der Struct Erstellung, der darin enthaltenen Klasse einen Wert übergeben?

C-/C++-Quelltext

1
class_beispiel unit( framework );

So gehts ja normal.


C-/C++-Quelltext

1
2
3
4
5
6
struct test
{
     class_beispiel unit;
}

test unit_data;

Wie müsste das aussehen wenn ich das so machen will, ich müsste der Struct "unit_data" ja in der darunter liegenen Klasse "unit" jetzt das framework übergeben. Aber ich hab k.A. wie man das machen sollte. Bzw. wo könnte man das nachlesen? Ich bin das jetzt halt umgangen, da ich beim erstellen der Klasse das framework noch nicht brauche, übergebe ich das halt später wenn ich Daten in die Klasse lade, die es benötigen. Mich würd aber jetzt interessieren, geht es so wie ich es zuerst machen wollte auch oder nicht? Liegt zwar schon ein paar Tage zurück, aber hatte da kein I-net, da ein Blitzeinschlag den Router gerostet hat. Vorallem Funktioniert meine andere Lösung nur weil ich einen Zeiger auf das framework habe, mit einer Referenz müsste ich es ja gleich übergeben. Aber da ich das struct später in einen vector schiebe, muss ich leider auf sie verzichten, liebe die eigentlich. :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Shorkan« (17.10.2014, 14:41)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

16.10.2014, 20:31

Du machst für das Struct einen Konstruktor mit Parameter, rufst in diesem den Konstruktor des Members auf und übergibst den entsprechenden Parameter dort. Wie man das eben so macht, wenn Konstruktoren von Membern Parameter erfordern. Du solltest übrigens generell alle Member von Structs und Classes im Konstruktor initialisieren um unerwartetem Verhalten vorzubeugen.
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (16.10.2014, 20:36)


3

16.10.2014, 21:26

Oh man, danke, ich hab wohl ein struct bis heute noch nicht richtig kapiert gehabt. Ist ja im Grunde ähnlich class nur das alles automatisch public ist. Wird aber glaube ich bei C++ für Spieleentwickler auch nicht erwähnt. Aber nagut hab das als ich angefangen hab auch nur durchgelesen, nie damit gearbeitet. Komm aber eigentlich recht gut klar nur ab und zu bin ich etwas überfordert.

Danke für den weiteren Tipp, bin ich bis jetzt zwar noch nicht darüber gestolpert und alleine ist es wohl nicht so gefährlich, aber sollte ich in Zukunft besser darauf achten. Aber liegt vieles wohl auch daran das ich es nie wirklich gelernt habe. Einfach drauf los programmiert, will auch garnicht daran denken wie der Code am Anfang bei mir aussah, da waren schon paar komische Sachen dabei. Über die ich heute lachen kann. Aber ich muss sicher noch vieles lernen.

Mir ist gerade auch noch was eingefallen was ich nie so wirklich beim struct verstanden hab. Ich wollte mal in einer Funktion einer Klasse ein Struct erzeugen um es dort wegen Berechnungen zu benützen. Im Struct selbst konnte ich problemlos als ich es erstellt hatte auf die Werte zugreifen. Als ich es dann aber in einen Vector speichern wollte ( der auch nur in dieser Funktion vorhanden war ) waren die Werte fehlerhaft, er hatte keinen Bezug mehr auf sie. Beim durchschreiten waren im Vector bei den Daten Error Meldungen. Visual Studio hat aber erst im laufenden Betrieb gemerkt das dort Fehler erzeugt werden, compilt hat er es problemlos.

.hpp Datei

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class test_class
{
    private:

    public:
    
    void test;
};


.cpp Datei

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void test_class::test()
{
     struct data
     {
          int a;
          int b;
     };

    std::vector< data > werte;

     data temp;

     temp.a = 12;
     temp.b = 5;

     // jetzt stimmen die werte im temp;

     werte.push_back( temp );

     werte[0].a; <-- würde jetzt einen Fehler produzieren
}



Ist das normal? In der main kann ich das ohne Probleme machen, warum in einer Funktion einer Klasse nicht? Wenn das normal Funktionieren sollte muss ich mal nachschauen wo genau der Fehler bei mir mal aufgetreten ist. Um den genauen Code mal zu Posten. Ich hab das Struct dann halt in der Klasse definiert, wurde aber halt nur für die eine einzige Funktion gebraucht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

16.10.2014, 21:44

In ideone wird das problemlos und fehlerfrei ausgeführt. Sicher, dass Dein Code nicht noch irgendwas anderes gemacht hat? Z.B. erst das Struct in den Vector geschoben und dann die Werte des Structs geändert? Das wäre nämlich in der Tat falsch, auch wenn es wohl keine Abstürze, sondern einfach nur falsche Werte liefern würde.

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
#include <iostream>
#include <vector>

void test()
{
    struct data
    {
        int a;
        int b;
    };
 
    std::vector< data > werte;
 
    data temp;
 
    temp.a = 12;
    temp.b = 5;
 
    werte.push_back( temp );
    std::cout << ":" << werte[0].a;
}

int main() {
    test();
    return 0;
}

Gibt ":12" aus.
http://ideone.com/Xqfr07
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

16.10.2014, 23:51

Na toll, zulange gebraucht zum Schreiben, hat er mich einfach abgemeldet.


Code hab ich leider nicht mehr gefunden, muss ich wohl leider gelöscht haben, liegt auch schon über ein Jahr zurück. Ich hab bei meinen vorletzten Spiel die KI komplett geändert, weil eine eigenständig Denkende KI für mein Spiel zu umständlich war, das hätte mich Jahre gekostet, so kompliziert wie mein Kampfsystem war. Deswegen hab ich dann für jeden Kampf die KI in eine Text Datei selbst zusammengebaut. Als das dann auch noch richtig gut geklappt hat, hab ich den alten Code weggeworfen. Da war das wohl sicher dabei. Hab ansonsten alle Dateien meiner Programme durchgeschaut, war sonst nirgends.

Hab es dann auch selbst getestet und ein einfaches Beispiel in eine Funktion gepackt. Beim einzeln durchlaufen hat er mir im Vector zwar Verbot Schilder im Visual Studio angezeigt, aber die Werte konnte er dann Problemlos zusammenrechnen. Auch wenn ich Werte im Vector veränderte oder sie dort auch erst initialisierte.

Da es aber schon längere Zeit zurück liegt kann ich jetzt nicht sagen ob Visual Studio da wirklich mal einen Fehler hatte. Benütze jetzt die 2010 Version, vllt hatte ich da sogar noch die 2008 im gebrauch gehabt. Aber kann auch durchaus sein das ich da irgendwas falsch gemacht hab, auch wenn mir jetzt nicht einfällt was ich dabei Falsch gemacht haben könnte. Was ich sicher noch weiß, ich hab das Struct schon mit den Werten gefüllt und dann erst in den Vector geschoben. Im Vector waren dann sofort fehlerhafte Werte und bei der ersten Abfrage gabs dann den Fehler im Programm. Aber leider hatte ich mir die Fehlermeldung auch nichtmal aufgeschrieben.

Ich weiß den Aufbau noch so sicher weil ich mir das so ungläubig angeschaut hab, kurz zuvor die Werte noch richtig, im Vector dann gleich kaputt.

Hätte mir den Code jetzt gern auch nochmal selbst angeschaut was der Fehler dort war oder ob er jetzt doch auch ginge. Schade. Naja bin auch selbst schuld, da ich den Fehler sehr einfach umgehen konnte, indem ich die Struct Vorlage in der Class definiert hatte. Hab ich da bis heute nie nachgefragt. :dash: Verstanden hab ich es damals nicht, schien mir unlogisch.

Was mich jetzt interessiert, warum sollte man die Daten des Structs, sobald es im Vector ist nicht mehr ändern? Warum sollte das falsche Werte produzieren, wenn man es bewusst macht? Würd ich gern verstehen. Bauen das manche Compiler nicht richtig um beim Code erstellen oder was ist der Grund dafür? Müsste meinen Code durchschauen, aber hab das sicher irgendwo gemacht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

17.10.2014, 07:08

Was mich jetzt interessiert, warum sollte man die Daten des Structs, sobald es im Vector ist nicht mehr ändern? Warum sollte das falsche Werte produzieren, wenn man es bewusst macht? Würd ich gern verstehen. Bauen das manche Compiler nicht richtig um beim Code erstellen oder was ist der Grund dafür?
Der Grund ist der, dass beim push_back eine Kopie des Structs in den Vektor gepackt wird und keine Referenz. Daher kannst Du die Werte nicht einfach nachträglich ändern. Dafür müsstest Du Dir nach dem push erst eine Referenz auf das Element aus dem Vector geben lassen. Der Compiler macht da durchaus alles richtig, aber Du nicht ;)
Deine Frage lässt aber durchblicken, dass Du Dich noch einmal mit Funktionen und Parametern beschäftigen solltest. Du vermutest die Existenz von erstaunlich vielen Compiler-Bugs und im Normalfall ist das eher ein Zeichen dafür, dass dem Programmierer ein absolut korrektes Verhalten des Compilers unbekannt ist. Wenn Dir bisher keine vernünftige Initialisierung im Konstruktor bekannt war, würdest Du vermutlich auch von lauter solchen Compiler-Bugs sprechen, sobald im Release-Modus alle Deine Variablen beim Start des Programms total vermüllte Werte enthalten - was aber auch wieder nur ein Fehler Deinerseits wäre.
Das soll jetzt nicht fies gemeint sein oder so, ich denke nur, dass Dir etwas Auffrischung Deines Wissens sehr helfen würde Deine Probleme zu verstehen.
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]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (17.10.2014, 07:16)


7

17.10.2014, 14:11

Hmm ich glaube wir reden aneinander vorbei, wenn ich mich jetzt nicht täusche.

Das der Vector eine Kopie von meinen Struct erzeugt will ich ja, das Struct ist bei mir nur dazu da um den Vector zu füllen, erfüllt sonst keinen weiteren zweck. Meistens änder ich die Daten des Struct gleich darauf wieder und packe es erneut in den Vector.

Ich dachte jetzt, wenn ich den Wert im Vector ändere, produziert der Wert im Vector andere Werte, wie ich ihm angebe. Das er dann einen anderen Wert wie das Struct hat ist mir bewusst und so gewollt.

Was ich halt nicht Verstehen würde und wo ich mich dann weiter damit befassen müsste ist, wenn die Kopie im Vector sich nicht genauso wie ein Struct außerhalb verhalten würde. Weil dann hab ich da wohl ein großes Verständnis Problem, ich lager auch komplexere Classen in Vectoren. Deswegen dachte ich auch an einen Compiler Fehler, weil das für mich keinen Sinn ergeben würde, von dem Wissen das ich bis jetzt habe. Aber vllt fehlt mir da wirklich etwas wichtiges noch.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

17.10.2014, 14:15

Wie gesagt, es wird eine Kopie hinein gepackt und eventuell auch wieder eine Kopie heraus geholt. Du kannst aber natürlich auch auf einer Referenz arbeiten, die Du Dir vom Vector auf das Element geben lässt.
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

17.10.2014, 14:39

Ah gut dann mach ich nichts falsch. Nur vllt unschön und Fehler anfälliger, aber das weiß ich eigentlich und bis jetzt bin ich damit noch nicht auf die Nase gefallen, aber das kommt sicher noch. Aber ok ich wusste auch bis gestern nicht das ich dem struct Funktionen schreiben kann um auf die Werte zuzugreifen. Werd das momentan aber wohl nicht ändern, da ich sie recht einfach gehalten hab. Für umfangreicheres benütz ich dann Classen brav mit Funktionen.

Danke für die Geduld mit mir.

Werbeanzeige