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

Korowai

unregistriert

1

01.09.2015, 20:46

Array von Objekten duplizieren

Hi,

ich habe eine Strukturfrage zur Codegestaltung. Diesmal möchte ich mich vorab informieren, bevor ich blind durch die Gefilde von c++ stolpere.

Ich habe mehrere Objekte (Klassen), die bereits in einem array zusammengefasst sind.

In dem geplanten Spiel sollen diese Objekte im array während der Runde zu bestimmten AKtionen gesendet werden, unter anderem als Geschwader/ Flotte mit gleichem Ziel aber unterschiedlichen Aufgaben.

Am Rundenende werden diese AKtionen dann Schiff für SChiff ausgeführt, inklusive Reisezeit, allerdings in Abhängigkeit voneinander (getrennte AKtionen, aber gemeinsam im Falle eines ANgriffs kämpfen)

Ich habe mir überlegt, VAriablen (int) für die AKtionsart zu nehmen und getrennt den Schiffen zuzuweisen und ggf mit Werten zu belegen, die dann am Rundenende die gewünschte Aktion liefern.
Bei einem Geschwader muss ich allerdings Objekte, die in unterschiedlichen arrays gefasst sind, in einem gemeinsamen array(?) oder vector (?) übergeben.
Das dann im RAhmen einer Auflistung der Schiffe, die auf der gegebenen Basis gelandet sind und deren Namen der Reihe nach vom SPieler eingegeben werden, wenn er diese als Geschwader ausbilden möchte. DIese Namen werden in einer Schleife dann aus den arrays in die Geschwader- array kopiert, und nach dem Rundenende sollen etwaig geänderte Werte wieder zurück übergeben werden.

Meint Ihr, dass das so funzt, oder gibts was besseres oder hat jemand eine Idee dazu?
Danke

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

02.09.2015, 16:38

Ich bin mir schon nicht sicher ob Arrays die passende Datenstruktur sind. Das hängt natürlich von den Anforderungen ab. Hast du da wirklich eine statische Anzahl? Ansonsten würde sich ja hier vermutlich schon eher ein std::vector eignen. Je nachdem vielleicht auch eine andere Datenstruktur.
Du musst auf Werte aus verschiedenen Arrays zugreifen. Möglicherweise kannst du deinen Code anders strukturieren. Wenn du auf Werte aus verschiedenen Datenstrukturen zugreifen musst ist das möglicherweise ein Anzeichen dafür dass du deinen Code anders designen solltest. Was zusammen gehört würde man dann auch zusammen speichern. Das kommt jetzt natürlich drauf an was genau du vor hast. Ich kenne ja weder deinen Code, noch dein genaues vorhaben. Aber möglicherweise machst du dir mal Gedanken ob du das alles nicht anders strukturieren kannst.
Anstatt Werte aus einem Array zu holen, zu verarbeiten und danach wieder zurück in das Array zu schreiben kannst du auch mit Referenzen arbeiten. Kopier die Werte aus dem Array nicht sondern hol dir eine Referenz darauf welche du direkt verändert.
„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.“

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

3

06.09.2015, 17:39

Arrays bei statischer Anzahl bzw. std::vector bei einer dynamischen Anzahl scheint mir die richtige Datenstruktur. Prinzipiell sind die Alternativen in C++ bis auf Ausnahmen unterlegen.

Zitat von »Korowai«

Variablen (int)

int is evil. Ich bin mir nicht ganz sicher, was du erreichen willst, aber das klingt zum Beispiel nach einem Anwendungsfall für eine Enumeration.

Mir ist nicht ganz klar, ob du wirklich Objekte kopieren musst. Mir scheint, als ob ein Geschwader einfachZeiger auf die Schiffe haben könntest ohne die Schiffe zu kopieren. Es ergibt für mich auch logisch keinen Sinn, zwei Schiffe zu haben wenn es sich beidemale um das selbe Schiff handelt. Angenommen, du würdest ein unbekanntes Objekt kopieren müssen, dann wäre das am Einfachsten mit einer virtuellen Methode zu erreichen, die für jede Instanz den entsprechenden Kopierkonstruktor aufruft (Ähnlich zu Clone in C#). Für mich klingt deine Beschreibung aber nicht danach, als ob das tatsächlich der richtige Ansatz wäre.

Korowai

unregistriert

4

07.09.2015, 23:01

Ja ich glaube ich sollte mich erstmal intensiver um die Möglichkeiten von Objekten kümmern.

Array wäre die falsche Wahl, denke ich.

Vielleicht beschreibe ich besser das Problem, mit der BItte, mir zu sagen, welche Referenz ich lernen sollte, um es zu lösen.

Ich habe die Schiffe, bei mir Modelle genannt, auf der Basis von verschiedenen Klassen erzeugt.
ALso Bsp:
class Schiff 1: SPieler hat bis zu 4: gepackt in array
class Schiff 2: Spieler hat bis zu 4: gepackt in array
etc...

Diese SChiffe sollen als Geschwader, eine EInheit, zu Zielen gesendet werden um Aufgaben zu erledigen.
Das heißt, ich muss die Schiffe zunächst identifizieren und später, während der Aufgaben, ebenfalls. DIes möchte ich über die Namen machen, die der SPieler den Schiffen geben kann. Die GEfahr einer NAmensdopplung ist beachtet.

Ablauf:

Programm listet die verfügbaren Schiffe auf (Memberfunktion)
SPieler gibt die Namen der Schiffe ein, die ein Geschwader bilden sollen (Programm soll per Namen die SChiffe in... HIER DAS PROBLEM ... vector? packen, sie mit einer Flugzeit versehen und über Variablen die vom SPieler für jedes Schiff gewählte Aufgabe ausführen lassen. Nach Ablauf der Aufgaben kehren die SChiffe (mit geänderten Werten) wieder zurück.

Tja, und da stosse ich an meine Kenntnisgrenzen. Ich habe mich bisher nur peripher mit Vektoren beschäftigt. Auch der BEgriff der virtuellen Funktion ist mir nur Begriff.

Wie gehe ich da am Besten ran? Was muss ich mir aneignen?

Danke

Korowai

unregistriert

5

12.09.2015, 15:11

2 Klassen in einen Vektor

Hallo,
ich habe ein wenig code geschrieben, um das aus dem topic auftauchende Problem, das ich habe, zu verdeutlichen.

Ich möchte zwei Klassen in einen Vektor packen, weiß aber nicht, wie.

Hier der code:

main:

Quellcode

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
#include <iostream>
#include <conio.h>
#include <iterator>
#include <list>
#include <vector>
#include <list>
#include <stdio.h>
#include <cstdlib>
#include <ctime>
#include <string>
#include "A.hpp"
#include "B.hpp"

using namespace std;

A Mobil_A[4];
B Mobil_B[4];

vector<string> Auswahlname;
vector<
int Mobilanzahl;

void Namenseingabe (int &Mobilanzahl)
{

    int Verteilung=0;
    int A_Verteilung;
    int B_Verteilung;

    for (int x=0;x<Mobilanzahl;x++)
    {
        Verteilung=Verteilung+1;
        if (Verteilung<Mobilanzahl/2)
        {
            cout << "Name von A "<<Verteilung<<" eingeben:"<<endl;
            cin >> Mobil_A[x].name;
        }
        else
        {
            cout << "name von B "<<Verteilung<<" eingeben:"<<endl;
            cin >> Mobil_B[x].name;
        }
    }


    return;
}

int main()
{

    string Name;
    srand(time(0));
    Mobilanzahl=rand()%3+1;
    cout << "Es sind " << Mobilanzahl <<" vorhanden."<<endl;
    cout << "Namen abfragen:"<< endl;
    Namenseingabe(Mobilanzahl);
   for (int x=0;x<4;x++)
   {
    Mobil_A[x].Namensausgabe();
    Mobil_B[x].Namensausgabe();
   }

    cout << "welche Namen sollen ein Geschwader bilden?"<<endl;

    for (int x=0;x<Mobilanzahl;x++)
    {
        cin >> Name;
        cout << endl;
        Auswahlname.push_back(Name);
    }



    return 0;
}



die header:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED
#include <string>
class A
{
public:
    std::string name;
    bool Geschwadermitglied;
    int Geschwaderziel;
    int Geschwaderzeit;

    A();
    ~A();

void Namensausgabe();


};

#endif // A_HPP_INCLUDED


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef B_HPP_INCLUDED
#define B_HPP_INCLUDED
#include <string>
class B
{
public:
    std::string name;
    bool Geschwadermitglied;
    int Geschwaderziel;
    int Geschwaderzeit;

    B();
    ~B();

void Namensausgabe();

};

#endif // B_HPP_INCLUDED


die files:

Quellcode

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
#include "A.hpp"
#include <iostream>
#include <string>

using namespace std;
A::A()
{
    std::string name=" ";
    bool Geschwadermitglied=false;
    int Geschwaderziel=0;
    int Geschwaderzeit=0;



};

A::~A()
{

};

void A::Namensausgabe()
{


            cout << "  Name: "<< name<<endl;


    return;
}


Quellcode

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
#include "B.hpp"
#include <string>
#include <iostream>
B::B()
{
    std::string name=" ";
    bool Geschwadermitglied=false;
    int Geschwaderziel=0;
    int Geschwaderzeit=0;



};

B::~B()
{

};


void B::Namensausgabe()
{
    std::cout << "  Name: "<< name<<std::endl;
    return;
}


Kann mir da jemand helfen?

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

12.09.2015, 15:46

Das Stichwort hierfür heißt Polymorphie.
„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.“

Korowai

unregistriert

7

12.09.2015, 17:46

HI,

habe die Möglichkeiten von Einfach- und Mehrfachvererbung überflogen. Mir ist nicht klar, wie das mein Problem lösen kann.

SOll ich die beiden Klassen in eine übergeordnete Klasse packen? WIe soll ich das anstellen, da sie ja zusätzlich bereits in arrays gepackt sind?

An sich brauche ich ja nur eine Auswahl der Instanzen der diversen Klassen, die an Funktionen übergeben werden sollen.

Uff, das wird ne Packung. ?(

Werbeanzeige