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

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

11

21.09.2016, 10:04

Ich würde ihn jetzt noch nicht direkt mit dem <algorithm>-Header überfordern, dafür sollte man ein grundsätzliches Verständnis der Container haben. Besonders, weil da noch Lambdas hinzukommen, mit denen er erst viel später konfrontiert wird.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Korowai

unregistriert

12

21.09.2016, 11:50

Danke Leute,
Das ist jetzt erstmal viel Futter, gut so. Ich werde ne Weile brauchen, das alles abzuarbeiten.

Korowai

unregistriert

13

22.09.2016, 20:13

Attribut einer vector Klasse per Iterator

Hi,

nur kurz, um vorab zu fragen, ob das funktioniert...

Ich möchte eine Membervariable (public) einer Klasse abfragen, die in einer Iteratorschleife ist.

Geht das so? Bevor ich es code, lieber gleich gefragt... Danke

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for ( vector<Arsenal>::iterator it = Arsenal0Element.begin(); it !=Arsenal0Element.end())
{
      if (it->a_Einschlagszeit==0)
{        // tu was
         it=vector.erase(it)
}
//
// weitere if else und eine for Schleife
// bis dann der Iterator dran kommt
else 
{
++it
}

}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

22.09.2016, 21:51

Ja, das sollte rein prinzipiell funktionieren; es sei aber darauf hingewiesen, dass es vermutlich effizienter wäre std::remove_if() zu verwenden... ;)

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

15

22.09.2016, 22:33

Das wurde bereits erwähnt. Ich habe jedoch gemahnt, dass der algorithm-Header eher ein Thema für Fortgeschrittene ist. Als blutiger Anfänger kann man noch mit den Iteratoren arbeiten, solange man im Hinterkopf behält, dass es auch schöner geht.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

22.09.2016, 22:37

Geht das so? Bevor ich es code, lieber gleich gefragt... Danke

Du hast den Code doch schon geschrieben :) Steck das ganze doch einfach in eine main Funktion und lass es mal übersetzen. So aufwendig ist das ja nicht;) Und dann hast du die Antwort schneller als hier zu warten.

edit: alternativ geht das auch bei Seiten wie dieser hier.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Schorsch« (22.09.2016, 22:47)


Korowai

unregistriert

17

23.09.2016, 08:01

Ergebnis

Hi,

ich präsentiere mal einen Arbeitsvorgang, damit andere auch was davon haben.

Klassenheader

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef KLASSE_H_INCLUDED
#define KLASSE_H_INCLUDED

#include <iostream>
#include <string>
using namespace std;

class Klasse
{
public:

    int a_Ziel;
    int a_Einschlagszeit;

    Klasse();
    ~Klasse();
};


#endif // KLASSE_H_INCLUDED


Klassensource

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Klasse.h"
#include <iostream>
#include <string>
using namespace std;


Klasse::Klasse()
{
    a_Einschlagszeit=0;
    a_Ziel=0;
}

Klasse::~Klasse()
{

}


main

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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include <iostream>
#include <wchar.h>
#include <conio.h>
#include <iterator>
#include <list>
#include <vector>
#include <stdio.h>
#include <math.h>
#include <cstdlib>
#include <stdlib.h>
#include <ctime>
#include <string>
#include "Klasse.h"
#include <tchar.h>

using namespace std;

vector<Klasse> Arsenal0Element; // Initialisierung Vektor "Arsenal0Element" der Klasse "Klasse"

int main()
{
    int Eingabe;

    for (int y=0;y<4;y++)
    {

    cout << "Geben Sie das Ziel ein"<<endl;
    cout << "1 - 9 - 13 - 21"<<endl;
    cin >> Eingabe;
    if (Eingabe == 9|| Eingabe == 1 || Eingabe ==13 || Eingabe ==21)
    {

    Klasse *s1 = new Klasse;
    //Anlegen eines Zeigers auf ein neues Element der Klasse

    s1->a_Ziel = Eingabe;
    //Füllen des Zeigers mit einem Wert "Eingabe" und Zuweisen auf die Membervariable der Klasse

    Arsenal0Element.push_back (*s1);
    // Anlegen eines Vektoreintrags am Ende des Vektors mit den Inhalten des Zeigers

    }
    else
    {
        cout << "Falsche Eingabe";
        return 0;
    }
    }

    for (int x=0;x<4;x++)
    {
    Arsenal0Element[x].a_Einschlagszeit=0;
    // Direktes Ablegen eines Wertes auf eine Membervariable der Klasse im Vektor
    // Vorsicht, es sollte besser mit Arsenal0Element.size()-1 gemacht werden
    };

    for ( vector<Klasse>::iterator it = Arsenal0Element.begin(); it !=Arsenal0Element.end();)
           {
                if (it->a_Einschlagszeit==0&&it->a_Ziel==13)
                        {
                            it = Arsenal0Element.erase(it);
                            cout << "Eingabe Ziel " << it->a_Ziel << endl;

                        }
                else if (it->a_Einschlagszeit==0&&it->a_Ziel==1)
                        {
                            it = Arsenal0Element.erase(it);
                            cout << "Eingabe Ziel " << it->a_Ziel << endl;

                        }
                else if (it->a_Einschlagszeit==0&&it->a_Ziel==9)
                        {
                            it = Arsenal0Element.erase(it);
                            cout << "Eingabe Ziel " << it->a_Ziel << endl;

                        }
                else if (it->a_Einschlagszeit==0&&it->a_Ziel==21)
                        {
                            it = Arsenal0Element.erase(it);
                            cout << "Eingabe Ziel " << it->a_Ziel << endl;

                        }

            else
                {
                    ++it;
                }

           }



    return 0;
}


Es sind noch einige Schnipsel von includes dabei die nicht gebraucht werden, aber im Grunde ist es das erstmal soweit.

Korowai

unregistriert

18

23.09.2016, 08:06

Was mir jetzt noch nicht klar ist...

Ich habe den Vektoreintrag mit erase über den Iterator löschen lassen.

Trotzdem gibt es keine Fehlermeldung. Er gibt brav die Einträge aus. An sich müsste es doch eine Fehlermeldung geben.
Das Programm läuft aber.

???

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

19

23.09.2016, 08:41

Er gibt brav die Einträge aus. An sich müsste es doch eine Fehlermeldung geben.

An welcher Stelle sollte es weshalb Fehlermeldungen geben?
Ein weiterer Tipp, versuch dir bessere Benennung anzugewöhnen. Klasse oder Eingabe ist recht wenig Aussagekräftig. Und warum benutzt du immer "a_" als Präfix deiner Membervariablen? Damit schaffst du dir an sich doch nur unnötige Tipparbeit und machst das ganze etwas unleserlicher. Aber das nur am Rande :)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Nimelrian

Alter Hase

Beiträge: 1 216

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

  • Private Nachricht senden

20

23.09.2016, 08:51

Noch dazu schaffst du dir da Speicherlecks. Heutzutage braucht man new egtl. kaum noch.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Werbeanzeige