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

24.07.2013, 17:09

C++ Namensbereich in Klassen möglich?

Hey Leute

Habe kurz eine frage, habe eben einen Namensbereich in meiner Klasse erstellt, der Compiler meckert aber.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CEnemy
{
private:
    int Zahl;
public:
    namespace man
    {
        int x=5;
        int y=2;
    }
    void Init(int zahli){Zahl=zahli;}
    void ShowZahl(){cout <<Zahl << endl;}
    void ShowNameSpace(){cout<<man::x<< endl;
                         cout<<man::y<<endl;
                            }
};


habe bereits gegooglelt :D, habe nur gesehen, das es anscheinend nur über umwege möglich ist, das heißt ich erstelle den Namespace in einer anderen Datei oder über der Klasse.


Gibt es eine Lösung, wo ich den Namensbereich in der Klasse erstellen kann, so das er nur dort verwendet werden kann?

Klar ergibt das vielleicht gerade keinen sinn, aber ich probiere momentan ein wenig rum ^^.


Noch als kleine Frage nebenbei, hatte mir eben Typedef angeschaut, verstehe aber nicht wirklich den Sinn daran.
Habe nur gesehen, wie man z.b einen Int wert mit einem neuen Namen versieht und diesen dann benutzt.
Würde mich über Links mit beschreibungen und erweiterten benutzmöglichkeiten freuen :)

Gruß Leri

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

2

24.07.2013, 17:34

Also vorweg, du solltest dir ein gutes C++ Buch anschaffen z.B. Der C++ Programmierer. Dann erübrigen sich viele deiner Fragen und du musst hier nicht auf Antworten warten.
typedef

Zu deiner Frage mit den Namensbereich, wenn es niemand macht oder so wie von dir bemerkt nicht unbedingt funktioniert oder nur mit Tricks möglich ist, sollte man von so etwas absehen. Dies ist ein deutliches Zeichen für schlechten Stil, und den willst du dir doch nicht beibringen oder? Ein Stichwort nach dem du mal suchen kannst ist “nested classes”.
:love: := Go;

3

24.07.2013, 17:42

danke dir für deine Antwort, ja das Buch ist schon bestellt :) warte nur noch drauf.

Hatte gestern Abend hier ja nach guten C++ Büchern gefragt, die die meisten Sachen von C++ abdecken, möchte bloss bis dahin nicht warten, sondern schaue schonmal nach :).

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

24.07.2013, 18:08

Einen Namensraum in einer Klasse anzulegen ist meiner Meinung nach unsinnig. Ich wüsste nicht warum ich das machen wollte. Kann es in deiner Klasse mehrfach die Variablen x und y geben? Dann ist irgendwas an deinem Design falsch.
Das mit Typedef hat halt manchmal Vorteile. Einerseits kann es sinnvoll sein einen Namen für den Typ anzugeben der direkt zeigt wofür der Typ gut ist. Ein Beispiel ist size_t. Meiner Meinung nach aber viel wichtiger ist folgendes Beispiel:

C-/C++-Quelltext

1
std::list< vector<std::string> >::iterator it;


Wie du siehst ist der Typ oben sehr sehr lang. Wenn du diesen Typ oft schreiben musst wird dir das tierisch auf die nerven gehen. Hier kannst du mit typedef einen kürzeren Alias setzen. Das solltest du dann mit einem sinnvollen Namen versehen. Mein Beispiel ist jetzt aus der Luft gegriffen um irgendwas langes da hin zu zaubern. Ein sinnvolleres Beispiel wäre sowas: (Klasse Edge vorausgesetzt)

C-/C++-Quelltext

1
typedef std::list<Edge> edgeList;


Jetzt kannst du danach im Code jedes mal edgeList schreiben wenn du eigentlich std::list<Edge> meinst. Aus dem Namen wird direkt klar, dass es sich um eine Liste von Kanten handelt. Dies könnte man so bei Graphen benötigen. Sollte etwas klarer sein. Guck dir jetzt möglichst nicht alle Themen quer Beet an. Warte auf das Buch und arbeite es noch mal von vorne bis hinten durch. Wird dich am Anfang ein wenig nerven aber du wirst viele Kleinigkeiten finden die für dich neu sind. Zumindest bei den grundlegenderen Themen solltest du so vor gehen. Weiterführende Dinge wie Qt etc kansnt du dir angucken wenn es dich interessiert. Das ist als Grundlage für C++ nicht unbedingt wichtig.
„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.“

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

5

24.07.2013, 18:21

Alternativ kannst du eine innere struct benutzen

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
class CEnemy
{
private:
    int Zahl;
public:
    // Namenlose klasse die gleich als feld bei der Instanzirung mit angelegt wird
    struct
    {
        int x;
        int y;
    } man;

    // Konstruktoren kommen immer gut ;)
    CEnemy()
        : Zahl(0)
    {
        man.x = 5;
        man.y = 3;
    }

    void Init(int zahli){Zahl=zahli;}
    void ShowZahl(){cout <<Zahl << endl;}
    // hier musst du dann natürlich "." verwenden, da man ja jetzt eine membervariable ist
    void ShowNameSpace(){cout<<man.x<< endl;
                         cout<<man.y<<endl;
                            }
};

6

24.07.2013, 19:56

Vielen dank für die antworten, das Beispiel mit der Struktur ist echt gut :) funktioniert einwandfrei.

Bei typedef habe ich mir sowas schon gedacht.

Würde sagen das ist ziemlich nützlich und übersichtlich mit typedef, wenn mans denn nicht übertreibt :).

Nochmals vielen dank für die hilfe, hoffe mein Buch kommt bald an ^^

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

25.07.2013, 11:57

Zu Typedef ein Hinweis. Manchmal macht es sinn im Header einer Klasse bestimmte Typedefs als Vereinfachung zu geben. Das sollte man aber nicht übertreiben. Wenn du jetzt aber meine vorher genannte Edgelist in einer Funktion zum Beispiel 10 mal aufrufen musst, dann macht es sinn so einen Typedef am Anfang der Funktion zu setzen. So kannst du in der Funktion dann auf edgeList zugreifen und musst nicht jedes mal dieses riesen Konstrukt schrieben. Nach der Funktion ist das ganze dann nicht mehr gültig.
„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.“

8

25.07.2013, 18:49

okay, find ich eine gute Sache.

Kann ich auch explizit zum Beispiel anweisen, das er nur diesen Typ also den Typedef in einer Funktion benutzen kann?

z.b
ich Erstelle einen Typedef int der test heißt.

Eine Funktion wäre dann



C-/C++-Quelltext

1
2
3
4
5
test MyFunc(test a, test b)
{
test Ergebnis; 
Ergebnis=a+b;
return Ergebnis;



Logischerweise kann ich nun auch ganz normale Interger Variablen dafür nehmen.

Ist es aber auch möglich, das nur mein eigener Typedef verwendet werden darf?

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

9

25.07.2013, 19:21

Nein, das geht nicht, es kann immer noch der originale Datentyp verwendet werden. Wenn eine Funktion einen std::string haben will, dann kann ich auch einen std::basic_string<char> übergeben. In diesem Fall kann ich auch eine Int-Variable übergeben. Wenn du aber willst, dass der Parameter vom Typ Test ist, dann kannst du eine Struct Test erstellen und darin dein int speichern. Ich weiß zwar nicht, was es bringt, aber es geht.

Werbeanzeige