Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » [Programmstrukturierung] Großes Problem :(

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.04.2004, 19:20 Uhr
DerSchwarzeSchlumpf



Hi

Bin C++-Anfänger und habe anscheinend ein rießengroßes Problem mit der "Programmstrukturierung" und ehrlich gesagt keine Ahnung wie ich da etwas anders machen könnte.
Im Detail: Es geht um ein dynamisches Labyrinth, das vom Benutzer eingegeben wird. Es gibt freie Zellen, Mauern, Start- und Zielpunkt. Dabei ist die Ein-/Ausgabe dieser Elemente variabel und kann auf Wunsch vom Benutzer geändert werden.
Das Programm funktioniert (meiner Meinung nach perfekt) und egal was man eingibt, es stürzt nicht ab *g*. Aber scheinbar reicht da das den Tutoren doch nicht so wirklich

Ich habe derzeit folgende Klassen:
-> Matrix (beinhaltet grob gesagt das "Grundgerüst", sprich einen Bool** (wo die einzelnen Werte ob es jetzt eine freie oder besetzte Zelle ist) gespeichert werden) inkl. jeweilige Get/Set-Funktionen und dergleichen. Zudem sind hier noch die Methoden drin wenn man eine neue Matrix erstellen will udgl.
-> User-Elements: Dies ist eine "Basisklasse" von der ich mir dann "Input-Elements" und "Output-Elements" ableite. Diese beinhalten die individuellen Dartellungsformen von "Mauer", "Freie Zelle", "Startpunkt" und "Zielpunkt". Diese können durch entsprechende Methoden verändert werden.
-> Defined-Point: Dies ist eine "Basisklasse" von der ich mir dann "FinishPoint" und "Start-Point" ableite. Diese beinhaltet grob gesagt die Koordinaten vom definierten Start- und Zielpunkt.
-> Display-Labyrinth: Das Labyrinth soll am Bildschirm ausgegeben werden. dH sie muss auf "Matrix", "Output-Elements", "StartPoint" und "FinishPoint" zugreifen können.
-> Input-Handler: Die Benutzereingabe wird verwaltet. Dass diese Klasse dann ebenfalls auf alle Klassen zugreifen muss ist glaub ich klar *g*

So, derzeit löse ich das Problem "laut meinen Tutor" fatal und in einem schrecklichen C-Hack der hier zufällig funktioniert. Da ich davon ausgehe, dass ich von jeder Klasse nur eine Instanz brauche (was aber laut Tutor bei der Erweiterung fatal ist) hole ich mir jedesmal die Instanz direkt aus der Klasse:
sprich:

C++:
//Klasse
class InputElements : public UserElements
{
  public:
    ~InputElements();
    static InputElements *getInstance();

  protected:
    static InputElements *instance_;

  private:
    InputElements();
};

//Funktionsdefinition
InputElements* InputElements::getInstance()
{
  if(instance_==NULL)
    instance_ = new InputElements();

  return(instance_);
}

//Ich hole mir die Instanz wenn ich sie brauche
InputElements *my_input_elements= InputElements::getInstance();



So, ich muss jetzt aber das gesamte Design ändern und hab ehrlich gesagt keine Ahnung wie beziehungsweise was ich ändern soll.

Ich soll den Konstruktur auf keinen Fall private setzen und "manuell" beim Programmstart ein Objekt anlegen und das dann immer weitererichen.
Die grobe Struktur vom Programm wäre:
-> Input
-> Labyrinth
-> Output

Wobei Labyrinth wiederrum aus: Matrix, User-Point (das wiederrum aus StartPoint, FinishPoint) bestehen würde.

Aber was mach ich mit dem "DisplayLabyrinth"? Zudem leite ich Input-Elements und Output-Elements von einer Klasse ab, brauche die hier aber anscheinend unterschiedlich. Aber vor allem: Wie kann ich die Instanz dann richtig übergeben weil wenn hier die Unterteilung stark in die Tiefe geht müsste ich ja in jede Funktion die Objekt-Variablen weitergeben und das kanns ja auch nicht sein, oder? *g* *keine Ahnung hab*

würde mich echt total über ein paar tipps freuen *g* (:

lg ein c++-anfänger
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.04.2004, 08:57 Uhr
stephanw
localhorst


Hi!
Mal abgesehen davon, dass ich nicht so ganz verstehe, wie Dein Programm funktioniert und was es macht... denke ich es kommt darauf an, was Ihr machen sollt/wollt und was der Sinn hinter der Übung ist.
Grundsätzlich ist das kein C-Hack, sondern Objektorientiert in Reinkultur und Deine Klasse entspricht dem Singleton-Designpattern. Wenn Du tatsächlich nur eine Instanz brauchst, finde ich das genau passend. Die Alternativen wären
1.) das Anlegen globaler Objekte (was Deinem Ansatz prinzipiell nahekommt, aber wesentlich unsauberer ist) oder
2.) das Durchschleifen der Objekte durch die Funktionsaufrufe.
Ob das besser ist, kann man von Ferndiagnose schlecht sagen. Wie gesagt, könnte es darauf ankommen, worin der Sinn dieser Übung besteht. Mal als Beispiel: wenn jemand sich mit C-Strings beschäftigen soll und er einfach std::string nimmt, ist das sicher grundsätzlich sinnvoll, aber eben nicht Sinn und Zweck der Übung
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.04.2004, 12:57 Uhr
DerSchwarzeSchlumpf




Zitat:
stephanw postete
1.) das Anlegen globaler Objekte (was Deinem Ansatz prinzipiell nahekommt, aber wesentlich unsauberer ist) oder
2.) das Durchschleifen der Objekte durch die Funktionsaufrufe.
Ob das besser ist, kann man von Ferndiagnose schlecht sagen.


http://courses.iicm.edu/programmierpraktikum/uebungsbeispiele_20040325.pdf da wäre die angabe weil das jetzt so zu erklären ist kompliziert *gg*

Jo, ich bin noch immer fest davon überzeugt dass ich mit Singeton am besten fahre, aber angeblich soll das bei der "Erweiterung" scheiße sein, weil es dann ja immer nur ein Labyrinth geben kann und nur weil es hier bei der Übung "zufällig nur eines geben kann", heißt das nicht, dass man derart haarscharf darauf hinprogrammieren kann und darf... . naja, wer's versteht aber der arsch sitzt leider am längeren hebel... *g*

derzeit schauts so aus: Ich habe eine Matrix, die aus bool** besteht und die Werte "True" (Freies Feld) oder "False" (Mauer) halten kann. Zusätzlich gibt es noch die Klassen "StartPoint" und "FinishPoint") (beide von der Klasse User-Point abgeleitet weil die beiden ja idenditisch sind nur im Grunde nur die Coordinaten von den variablen Start- und Zielpunkten halten). Zusätzlich gibt es die Klassen "Input-Elements" und "Output-Elements" (beide von "User-Elements" abgeleitet, da sie auch das selbe sind *g*) die die Eingabe- und Darstellungsform des Labyrinths beinhalten (sprich der User kann frei entscheiden wie er dem Labyrinth bei der Eingabe eine "Mauer" mitteilen will (Standardmäßig ein "o") und kann auch entscheiden, wie er diese Mauer dann bei der "Ausgabe" angezeigt werden bekommt ("Standardmäßig auch ein "o", aber kann unterschiedlich zur Eingabe sein").
Zusätzlich gibt es dann noch Funktionen die die "BEnutzereingaben" verwalten.
Ein Problem ist dann die Funktion "DisplayLabyrinth", die Zugriff auf alles haben muss: Sprich: Matrix, Output-Elements, StartPunkt, ZielPunkt.

Das Problem ist: Derzeit hole ich mir jede Instanz in jeder Funktion wenn ich sie brauche. (für mich als c++-anfänger die einfachste und intuitivste Lösung *g*).

Das Problem ist: Das ganze Programm ist ziemlich "lose" und nicht strukturiert sondern setzt sich immer nur aus ein paar Teilbereichen zusammen.

Ich soll das ganze Programm von Grund auf neu strukturieren. dH grundsätzlich soll ein sogenanntes "Programm-Manager" exestieren der in 3 Modulen (was immer das ist *g*) aufgebaut sein soll: Input, Labyrinth, Output.

Input -> Eingabeverwaltung, Switch-Funktionen, Input-Elements?
Labyrinth -> Matrix, StartPunkt, ZielPunkt, alle "change-Funktionen" (StartPunkt versetzen, Ausgabezeichen ändern usw dh da müsste ich ja auch auf wirklich alles! zugriff haben).
Output -> Output-Elements, Display-Labyrinth (das braucht ja wiederrrum auch auf alles einen Zugriff).


So, ich habe aber wirklich keine! *g* Idee wie ich da jetzt anfangen soll weil ich mir nicht vorstellen kann wie ich da die einezlnen Objekte übergeben soll und was ich damit dann überhaupt machen kann.

EDIT: Achja, TEMPLATES jeglicher Art sind nicht erlaubt *g*

Dieser Post wurde am 27.04.2004 um 12:58 Uhr von DerSchwarzeSchlumpf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.04.2004, 14:45 Uhr
stephanw
localhorst


Naja gut, kann man vertreten die Aussage gegen den Singleton. Evtl. will das der Tutor einfach so, dass die Objekte direkt miteinander kommunizieren. Das hieße, dass die sich gegenseitig referenzieren. Und die Aufgabe des richtigen Konstruieren der Objekte könnte der "Programm-Manager" übernehmen. Z.B. legt er erst einen Input an, dann das Labyrinth und übergibt dabei den Input oder was weiß ich da ist Kreativität gefragt. Ihr sollt doch dabei bestimmt irgendeine Analyse-Methode üben, die Ihr in dem Zusammenhang kennengelernt habt ? Dann versuchs doch damit...
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: