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

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

06.04.2015, 18:13

Mein Gott Leute ihr beschwert euch über Zeug. Ja der Code ist sicherlich nicht besonders schön. Ja ich habe ewig nichts mit C++ gemacht und habe da so gut wie keine Ahnung mehr von. Bei dem Problem hier ging es aber doch um eine ganz andere Sache. Benutze ich beim nächsten mal halt Pseudocode.
Richtig, der =Operator war unsinnig. Wie man einen std::vector befüllt habe ich in meinem Code gar nicht gezeigt, ist sicherlich gut dass man das bei deinem Code noch mal sieht. Und der Code unter dem letzten Kommentar soll so ein Beispielaufruf sein wie der TE es gerne möchte. Den Code würde ich selbst auch nicht so schreiben. In den meisten Fällen wäre Einheit bei mir vermutlich eine Basisklasse. Speerträger könnte dann unter Umständen davon abgeleitet sein. Aber wie gesagt hier ging es um ein konkretes Problem und darauf habe ich versucht zu antworten.
„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.“

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

12

06.04.2015, 18:43

Ich glaube die Antworten waren schon mit einem gewissen Augenzwinkern ;)

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

13

06.04.2015, 19:08

Ich glaube die Antworten waren schon mit einem gewissen Augenzwinkern ;)

In der Tat, ja. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

14

06.04.2015, 19:27

Schorsch, das war nicht böse gemeint. Es ist bloß so, dass viele Leute die den Beitrag einmal lesen, Korowai eingeschlossen, möglicherweise noch nicht so viel Erfahrung in C++ haben und dadurch möglicherweise ziemlich verwirrt werden. Ich hoffe du nimmst es mir nicht übel, wenn ich sogar nochmal auf den Umstand eingehe:

Zitat

In den meisten Fällen wäre Einheit bei mir vermutlich eine Basisklasse. Speerträger könnte dann unter Umständen davon abgeleitet sein.

Es macht doch wenig Sinn, eine Liste von Objekten einer Basisklasse nach einer beliebigen abgeleiteten Klasse benennen. Entweder sind nur genau diese abgeleitete Objekte drin, dann kann man sie auch direkt beim Typ angeben, oder der Name ist irreführend.
In C++ kann man nämlich leider auch nicht so mit abgeleiteten Klassen arbeiten. Wenn man einen std::vector<T> hat, kann er nur Objekte vom Typ T enthalten. Auch keine abgeleiteten Klassen. Es ist schließlich nur Speicher für T und kein Speicher für zusätzliche Variablen einer eventuell abgeleiteten Klasse von T. Um Polymorphie verwenden zu können, müsste man also einen Pointer verwenden. Zum Beispiel std::vector<std::unique_ptr<T>>.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

06.04.2015, 22:00

War heute wohl ein wenig gestresst und hab da überreagiert. Tut mir leid, war ja an sich auch richtig. Aber mal zurück zum Thema:)
Es macht doch wenig Sinn, eine Liste von Objekten einer Basisklasse nach einer beliebigen abgeleiteten Klasse benennen. Entweder sind nur genau diese abgeleitete Objekte drin, dann kann man sie auch direkt beim Typ angeben, oder der Name ist irreführend.
In C++ kann man nämlich leider auch nicht so mit abgeleiteten Klassen arbeiten. Wenn man einen std::vector<T> hat, kann er nur Objekte vom Typ T enthalten. Auch keine abgeleiteten Klassen. Es ist schließlich nur Speicher für T und kein Speicher für zusätzliche Variablen einer eventuell abgeleiteten Klasse von T. Um Polymorphie verwenden zu können, müsste man also einen Pointer verwenden. Zum Beispiel std::vector<std::unique_ptr<T>>.

Da hast du natürlich recht. Der TE hat ein Beispiel gemacht wie er gerne auf die Daten zugreifen würde und daraus habe ich die Namen abgeleitet. Wie gesagt Polymorphie gibts in meinem nicht so dollen Beispiel ja auch nicht wie du selbst richtig angemerkt hast. So weit reicht mein C++ Wissen doch noch:) Wobei man Polymorphie in C++ nicht nur über Zeiger sondern auch über Referenzen erreichen kann. Lassen wir mein Beispiel vielleicht besser außen vor.

Sinnvoller als das Problem so anzugehen wie gewünscht, wäre ein wenig am Design zu ändern. Wenn du uns noch ein wenig mehr über das verrätst was du eigentlich vor hast können wir dir vielleicht ein wenig dabei helfen. Ein Beispiel war ja schon die Polymorphie wobei man eine Basisklasse für Einheiten hätte und dann davon spezielle Einheiten ableitet. Dann könntest du eine Liste vom Typ der Basiseinheit erstellen (Spiele Programmierer hat es ja schon angemerkt, der Typ ist die Adresse von Basiseinheit). Hier kommen jetzt alle Einheiten eines Spielers rein. So kannst du jeden Einheitentyp gleich behandeln. Vielleicht macht das aber auch gar nicht so viel Sinn. Das hängt halt ein wenig von dem ab was du eigentlich am Ende machen möchtest.
„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

16

07.04.2015, 06:53

Hi,

ich versuche, das Problem nochmal zu beschreiben:

Ich habe eine Klasse:
class CModell

Diese hat mehrere Variablen:
{
public:
int m_Basis;
int m_Struktur;
float m_Antrieb;
...
...
}

WIe man sieht, sind Integer und Float durchmischt.

Nun soll ein SPieler mehrere dieser Klassen führen.
Und es soll mehrere SPieler geben.
Ich brauche also eine Beschreibung, die folgende Verkettung möglich macht.

Spieler (i) hat CModell(n) mit den Variablen (var)

i sei 4; n geht gegen unendlich, muss verkleinerbar und erweiterbar sein; var sind von den SPielern bestimmbar.

Ich habe das vorher mit der openoffice Tabellkalkulation geplant, und es funktioniert mit den eingesetzten Verknüpfungen ganz gut.
JEtzt möchte ich das in c++ übertragen.

Bin noch dabei, mehr zu lesen. Leider sind in den BÜchern, die ich habe, die Anleitungen für verkettete Listen oder Vektoren immer derart,
dass lediglich Objekte erstellt werden, die bspw nur Integerwerte innehaben.

Vielleicht mal als Baum:

Spieler 1 Spieler 2 Spieler 3
Objekt1.1 Objekt 2.1 Objekt 3.1
var 1.1.1, var 1.1.2... var 2.1.1, var 2.1.2... var 3.1.1, var 3.1.2...

Objekt1.2 Objekt 2.2 Objekt 3.2
var 1.2.1, var 1.2.2... var 2.2.1, var 2.2.2... var 3.2.1, var 3.2.2...

Objekte sollen im Verlauf des Spieles miteinander agieren, sollen im Konstruktor erzeugt und wieder gelöscht werden.
Ihre Variablen ändern sich derweil.

Ich hoffe, ich konnte das einigermaßen darstellen. Ihr habt schon einige Lösungsansätze gehabt, ich muss dem mal nachgehen...
Falls jemand das Ei des Kolumbus hat, freue ich mich sehr über eine epiphanie.

Danke

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

07.04.2015, 06:57

Genau das wurde dir doch schon präsentiert. Du hast einen Vektor von Spielern und jeder Spieler hat einen Vektor von Einheiten.
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]

Korowai

unregistriert

18

07.04.2015, 07:02

O.K.,

in meinen Büchern sind die Beispiele nur mit Integer. Ich war mir nicht sicher, ob sich Integer, float und chars durchmischen lassen.
Ich versuche jetzt mal, mir das anzueignen und flechte es in den code ein.
Das Ergebnis poste ich dann. Kann allerdings einige Tage dauern, da ich ab morgen wieder arbeite.

Danke für die Hilfe,

Korowai

unregistriert

19

21.04.2015, 06:47

Vector does not name a type

Hi,

hatte Zeit mich in Vektoren einzuarbeiten.

Ich nutze zu dieser Zeit code::blocks und bekomme vom Compiler die Meldung :"...does not name a type"

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
#include <iostream>
#include <conio.h>

#include <list>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;

std::vector <int> vHSchuerfer(12);
std::vector <int>::iterator iHSchuerfer;
std::vector <int> vMSchuerfer(12);
std::vector <int>::iterator iMSchuerfer;
std::vector <int> vSSchuerfer(12);
std::vector <int>::iterator iSSchuerfer;
std::vector <string> vNameSchuerfer(1);
std::vector <string>::iterator iNameSchuerfer;
std::vector <int> vSpieler(2);
std::vector <int>::iterator ivSpieler;
std::vector <string> Schiffsname;
std::vector <string>::iterator iSchiffsname;

vSpieler[0]=1000000;


Hier steigt der Compiler schon bei der Zuweisung vSpieler aus.
Der Namespace ist da. Vektor ist inkludiert.

Kann mir jemand sagen, was ich übersehen habe?

20

21.04.2015, 07:09

Die Zeile und die genaue Fehlermeldung wäre interessant.
Aber mach mal die Leerzeichen zwischen std::vector und <int> weg.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »anti-freak« (21.04.2015, 07:23)


Werbeanzeige