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

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

1

21.06.2006, 11:23

Probleme mit Consolenanwendung

moin leute!

ich hatte so ne idee, was ich mal schreiben könnte, wenn mir in der schule langweilig ist .. nun ...

ich hab da ein problem .. und zwar

ich hab da eine select anweisung! sie soll mir einen char überprüfen, und je nachdem welchen wert er hat, halt was anderes ausführen (aha! :D)

naja.. wenn der user den wert 1 drückt zb soll das programm eine instanz einer bestimmten klasse erstellen..

jetzt ist es aber so, dass sich mein compiler aufregt, dass die initialisierung der instanz durch die anderen case-marken bzw. durch die default-marke übersprungen wird.

ich blick da nicht ganz durch ^^


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
// ...


//char for input

    char chInput;
    cout << "Was wollen Sie tun?" << endl << "Ihre Wahl: ";
    cin >> chInput;

    switch (chInput)
    {
    //ASCII: 49 = 1

    case 49:
        cout << "1" << endl;

        //instance of CDraw

        CDraw Draw;
        break;

    //ASCII: 50 = 2

    case 50:
        cout << "2" << endl;
        break;

    //ASCII: 51 = 3

    case 51:
        cout << "3" << endl;
        break;

    default: 
        cout << endl << "Falsche Eingabe, bitte geben Sie erneut einen Auftrag!" << endl << endl;
        TreatInput();

// ...
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

21.06.2006, 12:08

Die Fehlermeldung sagt Dir ja schließlich, woran es liegt. Nämlich dass die Instanzierung durch eine andere case-Marke übersprungen wird. Entweder ziehst Du die Variable aus dem switch-Block heraus (dann als Pointer, weil Du willst die Instanz ja erst innerhalb des case-Blocks erzeugen), oder Du bettest die Instanzierung in geschweifte Klammern ein, wobei jedoch zu beachten ist, dass das Objekt bei der schließenden Klammer wieder aufgelöst wird, was Dir aber jawohl bewusst sein sollte. (Was bezweckst Du eigentlich genau mit dem Code?)

Beispiel 1:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ...


    CDraw* pDraw;

    switch (chInput)
    {
    case '1':
        // Instanz erzeugen.

        pDraw = new CDraw; // Tja, wo rufe ich denn jetzt das delete auf?

        break;

    // ...

    }

// ... 


Beispiel 2:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ...


    switch (chInput)
    {
    case '1':
        {
            // Instanz erzeugen.

            CDraw Draw;
        } // Tja, hier ist die Instanz wieder futsch.

        break;

    // ...

    }

// ... 

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

3

21.06.2006, 16:24

das ist nur das menü eines kleinen programms was ich schreiben will!


ich brauch die instanz eben nur dann, wenn der benutzer "1" ausgewählt hat ...



heißt das also, der compiler lässt das nicht zu, weil der gültigkeitsbereich der instanz nur im case block liegt?


*EDIT:

ok, ich habs jetzt versucht, mit einer einfachen variable ^^
die ist außerhalb des blocks ja wirklich nicht mehr gültig ..
das wusste ich nicht!

ähm.. aber wie mache ich es dann, dass die instanz der klasse nur dann aufgerufen wird, wenn der eine fall eintritt.. ?

:roll:
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Phili

unregistriert

4

21.06.2006, 16:49

Also, wenn du nicht total auf Speichersparen proggst würd ich die Instanz immer erstellen, aber eben nur da verwenden.
-> Alle Probleme auf einmal gelöst.

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

5

21.06.2006, 17:11

das ist es ja :D
auch wenn ich noch der obernoob bin.. möchte ich so tun als ob mein programm extreeeem wichtig wäre.. klar kann ich die instanz vorher ... wie sagt man dazu .. erstellen? aufrufen? generieren?

aber ich will eben so tun als wäre es wichtig speicher zu sparen! darum will ich, dass die instanz eben nur dann aufgerufen wird ..
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

21.06.2006, 17:32

Dann nimm halt nen Pointer, den Du mit new erzeugst, so wie in meinem 1. Beispiel. Du musst halt nur irgendwo delete aufrufen, wichtig!

Phili

unregistriert

7

21.06.2006, 17:58

Also ich finde was unnötigeres ist kaum möglich. Aber theoretisch könnt man dich auch wegen Ordentlichkeit loben :D

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

21.06.2006, 18:39

Zitat von »"Phili"«

Also ich finde was unnötigeres ist kaum möglich. Aber theoretisch könnt man dich auch wegen Ordentlichkeit loben :D

Wen meinst'n jetzt...?

Phili

unregistriert

9

21.06.2006, 18:44

@Steven77


Ich mein $nooc aber auch das gesamte Thema. Also in ner einfachen Konsolenanwendung auf solche minimalen Speicherprobleme Wert zu legen...

ext

Treue Seele

  • Private Nachricht senden

10

21.06.2006, 19:20

Dadurch wird aber das RAII-Idiom verletzt, an welches man sich in C++ immer halten sollte.

Werbeanzeige