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

22.06.2011, 22:03

[C++] und [Java] - Fragen zu den Gemeinsamkeiten/Unterschieden

Hallo Community,

ich behandel im Moment das Buch "C++ für Spieleprogrammierer".
Nebenbei arbeite ich in der Schule mit Java und dem Programm BlueJ.

Mit Java komm ich ziemlich gut zurecht, doch mit C++ haperts noch etwas. Aus diesem Grund möchte ich mein bisher Erlerntes (bis Kapitel 10 im Buch) durch Übungen etwas festigen.
Das mit den Listings verstehen hat auch bei C++ immer gut funktioniert, doch das mit dem
do-it-yourself stellt doch ein paar größere Problemchen dar.

Also hab ich ein paar Fragen, ob das was man bei Java macht auch so in C++ umgesetzt werden sollte:

1.In Java haben wir mit BlueJ ein Billiardprojekt behandelt (vlt kennen es einige aus dem Infounterricht).
Dabei geht es um Kugeln die über den Bildschirm rollen. Klassen dafür werden größtenteils importiert.
Aber jetzt zum Kern: In Java haben wir eine eigene Klasse für das Hauptprogramm erstellt, also dort wo alles wie z.B. die Anzahl an Kugeln geregelt wird und einige Funktionen der Kugeln ausgeführt werden.
- Sollte man dies auch in C++ machen oder wird dies in die main-Funktion geschrieben?

2.In Java kann man dem Konstruktor einer Klasse Eingangsparameter übermitteln, wie in C++ auch. Wenn man ein Objekt dieser Klasse erstellt fordert BlueJ (wenn nicht im Programmcode bereits geschehen) zur Eingabe der Parameter auf. Dies geschieht in C++ nicht, es werden Fehler ausgegeben.
Hier ein Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
//Klasse in Java
public class Test
{
    //Attribute
    private int zVariable;
    
    //Konstruktor
    public Test (int pVariable)
    {
        //Init
        zVariable = pVariable;
    }
}


Durch Rechtsklick in BlueJ auf die Grafik der Klasse könnte man nun den Konstruktor
(new Test (pVariable)) aufrufen, anschließend wird man zur Eingabe der Eingangsparameter aufgefordert und das Objekt erzeugt.
-Wie wird dies in C++ umgesetzt?

Danke im Voraus und sorry wegen des ewig langen Textes (:

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

2

22.06.2011, 22:13

Mein Dozent hat Bluej mit entworfen, daher denke ich, hab ich einige Erfahrung was das angeht.
Ich finde Bluej einfach nur schlecht, denn Anfängern wird der Eindruck vermittelt, das man ohne weiteres gleich Grafisch (sprich 2D) programmiert. Das dies aber eig. ohne weiteres nur auf der Konsole geht ahnen viele gar nicht.
In späteren Semestern wirst du mit Eclipse arbeiten und dann langsam Komponenten wie Swing kennen lernen.
Denn eigentlich geschieht all das was du gerade von dir gibst (also das aufrufen und Parameter Übergaben) nicht visuell und grafisch (also nicht per GUI) sondern fest implementiert in Code der später aufgerufen wird. Bluej soll das ganze nur vereinfachen, ist aber, finde ich zumindest, ein falscher Ansatz. Es sollte erwähnt werden, dass das nicht der Standard ist.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

3

22.06.2011, 22:19

Okay, vielen Dank für die schnelle Antwort!

Das Problem ist in erster Linie jedoch nicht BlueJ, sondern wie ich speziell Punkt 2) in C++ umsetze.
Ich hab mir schon irgendwie gedacht, dass diese Eingangsparameter, in meinem Beispiel pVariable, irgendwo deklariert werden müssen. Doch ich wüsste gerne wo, damit ich mit meinen Programmen weiter komme, speziell mit einem sauberen Programmcode.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

4

22.06.2011, 22:25

In der main Funktion.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Foo {
public:
    Foo(int var) {
        _var = var;
    }

    int getVar() { return _var; }
private:
    int _var;
};

//...
int main() {
    Foo f(42);
    std::cout << f.getVar() << std::endl;
}

Oder steh ich auf dem Schlauch?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

5

22.06.2011, 22:33

Jaein,

ich glaube ich habe mich etwas schlecht ausgedrückt.
So wie du es jetzt geschrieben hast müsste man der Variable 'int var' vor Programmstart einen Wert zuweisen.
Ich möchte aber, dass während der Laufzeit z.B. ein neuer Benutzer erzeugt wird und diesem dann Parameter übermittelt werden. Also die Parameter werden während der Laufzeit des Programms abgefragt.

6

22.06.2011, 22:57

Wie meinst du das?

So: (?)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    int param;

    // Parameter bekommen (nur Bsp.)
    cin >> param;

    // Intanz erstellen
    MyClass instance(param);

    return 0;
}

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

7

22.06.2011, 23:10

Ich denke du meinst, man kann jederzeit ein neues Objekt erzeugen und diesen Werte zuweisen? Das geht nicht so wie in BlueJ ;) Du hast eig nur eine Konsole und kannst nur mit dieser mit dem eigentlichen Programm interagieren.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

8

22.06.2011, 23:18

Batzer genau, so mein ich das.
Doch das wird bei vielen Klassen doch sehr schlecht weil Klassen mit gleichen Variablennamen würden sich dann überschneiden...

Architekt aber mit z.B. einer Funktion, in der dann steht meineKlasse = new Klasse () könnte man doch auch während der Laufzeit einfach eine neue Instanz erstellen, oder?

9

23.06.2011, 13:00

Batzer genau, so mein ich das.
Doch das wird bei vielen Klassen doch sehr schlecht weil Klassen mit gleichen Variablennamen würden sich dann überschneiden...

int param;
cin >> param;
MyClass1 instance1(param);
cin >> param;
MyClass2 instance2(param);
cin >> param;
MyClass3 instance3(param);

Oder was meinst du? Anders macht man es bei Java doch auch nicht.

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

10

23.06.2011, 13:03

Ich verstehe nicht ganz worauf Du hinaus willst.
Das Konzept bei BlueJ ist wirklich sehr verwirrend, da die main()-Methode quasi von BlueJ gestellt wird. Im Prinzip ist es beim initialisieren der Klasse das gleiche wie bei Batzer, nur das man dort die Sachen eben in einen Dialog eingibt.
Wenn Du von einer Klasse mehrere Instanzen brauchst, dann fass diese doch zu einer Liste zusammen: std::List<BillardKugel> kugeln;

Werbeanzeige