Korrekte Modellierung + Implementation
-
Kleiner Einschub zu der Conatiner-Frage:
Ich hab den original Beitrag hier leider nicht gefunden. Es wurde allerdings mal auf ein Entscheidungsbaum verwiesen, wann sich welcher Container eignet.
Ich finde die Übersicht ganz cool.Hier der Link:
http://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-container
--> http://i.stack.imgur.com/G70oT.png
-
Wenn ich alles richtig interpretiert habe käme set raus, passt zum obigen Vorschlag für unordered_set, seh ich ein, ist aber eher ein Randproblem, weil mir vorerst nicht so wichtig ist, wie viel Overhead ich habe.
Im Endeffekt verwalte ich wenn es hoch kommt 50 Fenster, da schenken sich vermutlich alle Container kaum Kilobytes

-
Das sehe ich allerdings anders.
Möglicherweise hast du deswegen immer die Schwierigkeiten.
-
Nun gehört jedes Fenster auf genau einen Desktop (kann den aber wechseln), ein Desktop kann mehrere Fenster haben, Fenster sollen ihren Desktop kennen, und ich möchte unabhängig von Desktops über alle Fenster die es gibt iterieren können.
Die einzig relevante Design-Angabe hier lautet, dass jedes Fenster auf genau einen Desktop gehört, den aber wechseln kann.
Wozu ein Fenster seinen Desktop "kennen" soll, ist mir nicht klar. Was heißt überhaupt kennen? Nur seinen Namen? Dann braucht es keine Referenz auf einen Desktop. Soll jedes Fenster seinen Desktop auch steuern können? Wozu das? Und was macht ein Desktop mit seinen Fenstern?Vielleicht brauchst du nur so etwas:
vector<unique_ptr<Window>> windows; vector<unique_ptr<Desktop>> desktops; //... for (auto&& window: filter(windows, some_property)) draw(some_desktop, window); //Fenster "gehört auf" (?) genau einen Desktop
-
Ich bin begeistert, was für ein Haufen arroganter, überhabender Leute hier unterwegs sind.
Typisch Internetforum.
Da wäre einmal manni66, der augenscheinlich alles besser weiß, aber aus genau dem Grund kein hilfreiches Wort zu viel schreiben möchte, und stattdessen nur darauf bedacht ist, hilfesuchende wissen zu lassen, dass sie scheinbar Idioten sind.
Und dann wäre da dove, das typische Internetarschloch, das nicht die Frage beantworten will, sondern wie üblich die Rahmenbedingungen anzweifelt.
Für dove: Das kann dir am Arsch vorbeigehen, wieso ich sage, dass der Client seinen Desktop kennen muss. Ich will aber mal nicht so sein, und es dir verraten, damit du wieder ruhig schlafen kannst: Der Client ist später dafür zuständig, sich beim Desktop zu registrieren/löschen, deshalb muss er den kennen. Ob das für Eure Majestät nun akzeptabel ist, interessiert mich einen Scheißdreck.
Ist mir jetzt aber auch egal, ich hab keine Lust mit einem Haufen elitärer Wichser zu diskutieren.

-
Jetzt komm mal runter, süßer. Wenn du das Gefühl hast, dass gewisse Beiträge dir nicht weiterhelfen, ignoriere sie. Du musst dann nicht zum Schlagabtausch ausholen, den kann man gegen elitäre Wichser sowieso nur verlieren.
-
Arcoth schrieb:
Jetzt komm mal runter, süßer[<- c'mon]. Wenn du das Gefühl hast, dass gewisse Beiträge dir nicht weiterhelfen, ignoriere sie. Du musst dann nicht zum Schlagabtausch ausholen, den kann man gegen elitäre Wichser sowieso nur verlieren.
Das ist tatsächlich der beste Weg, sich in diesem Forum zu verhalten.
Hier zweifelt jeder immer gerne erstmal grundsätzlich an, was man so gemacht / geplant hat. Warum das so ist, weiß ich auch nicht. Muss wohl an der Natur der Thematik legen. Bei soviel Freiheit, die man durch eigene Erfahrung / Ideen gestalten muss, bildet halt jeder ein großes Selbstvertrauen in die eigenen Ansichten und dann ist Dein Ansatz halt erstmal doof.
Zugegeben ist es aber bei gerade der Thematik auch nicht einfach - die Leute finden deinen Dilemma-Situation wohl komisch und wehren sich zunächst gegen den Gedanken, überhaupt in dieses Dilemma gekommen zu sein.
Nur hilft das leider auch nicht so wirklich.Wenn du aber ruhig bleibst und mit viel Geduld an die Sache rangehst, dann kommt halt doch sehr oft nach ein bisschen rumposten Konstruktives bei raus, weil sich das Problem weiter kristallisiert und andere Leute doch etwas Input geben.
-
Naja, Beiträge von manni66 und/oder dove würde ich nicht ignorieren und schon gar nicht als "nicht hilfreich" abstempeln. Wer das macht, ist selbst schuld.
Außerdem muss, übertrieben gesagt, auf die Frage "Wie schlage ich mit einen Nagel in den Fuß?" die Antwort "Mach das lieber nicht, schlage den Nagel lieber in die Wand!" erlaubt sein, während hier manche scheinbar glauben, die einzig erlaubten Antworten müssten im Stil von "Nimm Nagel, nimm Hammer, setze Nagen an Fuß, schlage mit Hammer drauf" sein.
Schon komisch, Leute, die gute und fachlich fundierte Tipps geben, hier mit Fäkalsprache zu beleidigen.
-
Ist mir doch jetzt Wurst, ob das zum Ziel führt oder nicht. Ich hab hier eh schon abgehakt, ne brauchbare Antwort zu kriegen.
Wenn jemand offensichtlichen Blödsinn macht und man dann eher den zugrunde liegenden Irrtum beheben möchte, anstatt zu helfen, den Blödsinn umzusetzen - klar, und das versteh ich doch auch.
Aber das war hier nicht der Fall. Einer meint ich sei quasi zu blöd mein Problem zu erkennen ("Design, nicht Sprache"), der andere meint, er müsste dann daran zweifeln, dass das was ich vorhabe einen Sinn hat.
Wisst ihr, ich hatte einen erfahrenen Programmierer als Kollegen, den konnte man sowas fragen. Wenn man Unsinn machen wollte, hat er das gesagt. Und ansonsten geholfen, das Problem an sich zu lösen. Aber in Internetforen sind erfahrungsgemäß nur Arschkrampen unterwegs.
Mag ja sein, dass mein Problem unverständlich ist. Ich war der Meinung, die Essenz verständlich dargelegt zu haben, aber wenn dem nicht so war, ja meine Fresse dann fragt halt nach. Sind denn alle kommunikationsbehindert hier oder was.
Wie gesagt, ist mir nun auch Schnuppe, macht den Thread von mir aus zu und löscht meinen Account, geht ja anscheinend auch nicht in diesem Saftladen.
-
sdaf schrieb:
Ist mir doch jetzt Wurst, ob das zum Ziel führt oder nicht. Ich hab hier eh schon abgehakt, ne brauchbare Antwort zu kriegen.
Und deswegen schreibst du hier immer noch? Oder geht es dir nur um dein angeknackstes Ego? Also ich glaube, es geht um dein angeknackstes Ego. Das merkt man schon daran, dass du mit Fäkalsprache um dich wirfst, anstatt direkt den Punkt zu nennen, der dich stört.
sdaf schrieb:
Wisst ihr, ich hatte einen erfahrenen Programmierer als Kollegen, den konnte man sowas fragen. Wenn man Unsinn machen wollte, hat er das gesagt. Und ansonsten geholfen, das Problem an sich zu lösen. Aber in Internetforen sind erfahrungsgemäß nur Arschkrampen unterwegs.
Du verkennst den Nutzen eines Internetforums: man will nicht nur (ausgerechnet dir) helfen. Man will auch irgendwann mal was mitnehmen. Wenn man irgendwann selbst ein Problem hat und Google bedient und auf einen solchen Thread verwiesen wird, dann ist es für den Leser interessanter, sich zumindest einmal alle Seiten angehört zu haben. Vielleicht möchtest du gerade Unsinn machen, aber das gilt eventuell nicht für Leute, die in zwei Jahren ihre eigene Desktopverwaltung schreiben wollen.
Deswegen sagen die Leute direkt an, was schlecht ist. Wenn du gute Gegenargumente hast, immer her damit. Dass man auch nachfragt, ist natürlich. Braucht ein Fenster zu wissen, auf welchem Desktop es läuft? Allein schon die Antwort auf eine solche Frage determiniert das Design für eine Desktopverwaltung. Ich sage: ja, es kann von Vorteil sein, weil man sich so eventuell Locks und Unlocks spart, wenn stattdessen ein Funktionsaufruf erst mal Parameterprüfung machen muss. Aber dann sag sowas direkt an, und nicht stattdessen "Aber ich will Unsinn machen, deswegen sagt mir, wie ich Unsinn mache". Damit ist vielleicht dir geholfen, aber nicht anderen Leuten, die diesen Thread lesen.
sdaf schrieb:
Mag ja sein, dass mein Problem unverständlich ist. Ich war der Meinung, die Essenz verständlich dargelegt zu haben, aber wenn dem nicht so war, ja meine Fresse dann fragt halt nach. Sind denn alle kommunikationsbehindert hier oder was.
Nö, wir gehen davon aus, dass du ein vernunftbegabtes Wesen bist, welches sich darüber im Klaren ist, wie Hilfeforen funktionieren. Wenn dem nicht der Fall ist, verzeih' uns, und wir werden in Einigkeit deine Intelligenz anzweifeln und dir gar nicht mehr antworten.

-
Auf den ersten Blick sehen die Beiträge von manni66 wirklich so aus, als wolle er nur besserwisserisch daherkommen. Aber er möchte dich dazu bringen, dir die Frage zu stellen, warum du Dinge so machst und dann selbst zu erkennen, wo der Fehler liegt (jedenfalls glaube ich das :D). Das muss man aber auch erkennen können, was zugegebenermaßen, schwierig ist, wenn man neu im Forum ist.
Manchmal ist man in seinem Ansatz festgefahren, da kann es schon hilfreich sein zu fragen, ob ein anderer nicht besser ist. Wenn du von deinem Ansatz nicht abweichen willst dann stell das halt klar. Ansonsten hör dir doch erst ein Mal an, wie andere dein Problem angehen würden, dann kannst du immer noch entscheiden, wie du vorgehen möchtest.
Die Leute, die hier im Forum posten, tun das in ihrer Freizeit und freiwillig, ohne dafür einen Gegenleistung zu erhalten. Du kannst ja mal in der Fußgängerzone einer beliebigen Großstadt fragen, ob dir jemand freiwillig und ohne Entgelt helfen möchte. Bin sehr gespannt, was du da zu hören kriegst.
Wenn du mit manchen Antworten nicht zufrieden bist dann ignorier´ sie. Aber ausfallend zu werden und sprachlich in die unteren Schubladen zu greifen hilft keinem weiter, am wenigsten dir. Machst du das bei deinen Arbeitskollegen auch?
-
Haha was für ein Haufen heißer Dampf hier von sich gegeben wird ist zum brüllen. Für jeden Außenstehenden sind die Leute die hier "geholfen" haben offensichtlich die mit den Egoproblemen, anders kann ich mir die Autistenreaktionen hier nicht erklären.
Aber noch besser, jetzt werden mir auch noch Internetforen erklärt, der Thread ist gold. Bisher hat quasi keiner hier irgendein wertvollen, relevanten Tipp gegeben Herr Dachschaden (Name ist Programm, find ich gut).
Und ob das bekackte Fenster jetzt den Desktop anfassen darf, spielt noch immer keine Rolle. Ich habs Gefühl hier will jeder nur mal seinen Schwanz auspacken, und weil nix Relevantens einfällt schlägt man halt auf Randbedingungen ein, die völlig belanglos für die gestellte Frage sind.
Und was jetzt in einem Fachforum um Rat bitten mit Fußgängerbelästigung zu tun hat, ist mir auch ein Rätsel, ich fürchte ich bin noch nicht lange genug sozial isoliert wie der Rest hier.
Ich hab mal in einem Kinderzeichentrick gelernt: "Wenn man nichts Gutes zu sagen hat, sollte man lieber einfach still sein", das trifft auf mich zu, und auf quasi alle die hier "geholfen" haben.
Ich find euch unterhaltsam, leider auch nicht mehr.
-
Naja, was soll man da noch sagen... selbst einfachste Dinge nicht verstanden. Viel Erfolg bei deinem Projekt.
-
Endlich nach langen Jahren der Traurigkeit mal ein Troll hier im Forum.

-
Ach, ich seh das positiv. Pfuscher wie der TE sichern mir den Lebensabend.

-
Hähä ne, ich bin Hobbyfrickler, wenn ich Murks zusammenschuster stört nur mich das und bringt dir kein Geld.
Ich hatte ja gehofft, dass die Götter hier im Forum sich erbarmen würden, mich etwas in die richtige Richtung zu leiten, aber die Wege der Herren sind unergründlich und ich bin leider nicht würdig.
Ich bin froh, dass es solche Bastionen der Überheblichkeit noch gibt. Anderswo sind die meisten Communities weiter und sind sogar wirklich hilfbereit, das nervt auf Dauer, wenn man auf Erfahrung von anderer bauen kann.
In einem Punkt muss ich aber doch Kritik üben - Linuxcommunities im IRC sind noch eine Ecke asozialer als ihr, da ist also definitiv noch Luft nach oben!
-
@therapy
Das Problem ist dass du das was du da "modellieren" möchtest nicht klar definiert hast. Nicht nur hier im Forum nicht klar beschrieben, sondern auch dass du selbst keinen echten Plan hast was du eigentlich modellieren willst.Da stellen sich Fragen wie
- Wem gehören die Fenster? (Wer hat "ownership" - also wer bestimmt wann ein Fenster zerstört wird?)
- Ist es möglich/erlaubt dass es nicht-besitzende Referenzen auf Fenster gibt, die erhalten bleiben können/dürfen nachdem ein Fenster zerstört wurde?
- Wenn ja, wie soll das System reagieren wenn versucht wird so eine "verwaiste" Referenz zu verwenden?
usw.Das sind Dinge die erstmal mit C++ nichts zu tun haben. (Die aber geklärt sein sollten bevor man versucht zu entscheiden wie man das jetzt vernünftig in C++ umsetzen kann.) Und die man auch nicht in 2-3 Sätzen erklären kann. Das hat manni66 vermutlich mit seinem Beitrag gemeint.
Das will dir aber in den Kopf nicht rein. Du bist einfach zu sehr davon überzeugt zu wissen worum es geht, zu wissen dass das eigentliche Problem nur deine beschränkten C++ Kenntnisse sind, und nicht etwa grundlegendere Überlegungen usw.
Wenn du weiterhin der Meinung sein willst der Grund für das offensichtliche Kommunikationsproblem hier wäre auf "unserer" Seite und nicht auf deiner, bitte gern. Mach dir ruhig selbst vor was auch immer du dir vormachen willst.
-
Ja wenn meine Beschreibung nicht reicht, dann fragt halt nach meine Güte. Woher soll ich denn wissen, ob ihr mir folgen könnt ohne dass auch nur eine Person sagt "Deine Beschreibung ist uneindeutig - was willst du".
Ich probiers ein letztes Mal, wobei ich nicht davon ausgehe, dass es noch irgendwen interessiert.
Ich habe eine Client-Klasse. Die verwaltet Fenster. Von extern (X-Server, aber das soll keine Rolle spielen für Leute die keine X-Programmierung machen) kriege ich die Nachricht "Es ist ein neues Fenster aufgetaucht".
Ich will also dieses Fenster, und alle Attribute (sind einige) verwalten. Nun möchte ich was eben der Zweck eines Window Managers ist, Fenster auf Desktops einteilen. Aber da auch das hier wohl zu kompliziert ist und mir Unfähigkeit vorgeworfen wird, sagen wir es anders:
Client hat eine dynamische Ressource zu verwalten, die im Ctor aquiriert wird, und im Dtor freigegeben werden soll (in meinem Fall: Registrierung bei Desktop-Klassen, aber das hat niemand zu interessieren, es ist einfach so, dass dynamische Daten da sind, fertig aus).
Nun, dynamische Ressource heißt ja, dass ich sehr vorsichtig bei Kopien sein muss, und da ich Fenster/Clients (ist das gleiche, das eine ist X-Lib-Terminologie) in einem beliebigen (um Gottes Willen bitte nicht wieder eine Diskussion über Container) STL-Container verwalten möchte, wird das komplizierter.
Einfachstes Beispiel: Ich packe Client* in einen Container und Problem gelöst. Lösche ich ein Client, gibt der Speicher frei und gut ist. Ich will aber keine Rawptr.
Mein Ziel und meine Lösung momentan:
std::container<client> clients
Das erreiche ich indem ich copy ctor (es ergibt genau NULL Sinn Clients zu kopieren, es gibt nur ein physisches Fenster, und dazugehörige dynamische Daten duplizieren ergibt auch null Sinn) und Assignment verbiete. Dann hab ich den Move-Ctor definiert und nun geht sowas wie:
clients.push_back(std::move(client(...));
Damit wird der Client-Ctor exakt einmal aufgerufen, ich kann Daten aquirieren und im Dtor freigeben. Die Lösung fine ich fast okay, denn ich habe simpel verständlich eine authoritative Liste aller Fenster, die sich autonom um die dynamische Daten kümmern, wenn ich sie aus dem Container werfe und gut ist. Bis auf dass ich einige Mechaniken rundrum nicht verstehe.
Diese Lösung habe ich mir zusammen geschustert und ich hatte eigentlich gehofft mir schlägt jemand sowas vor oder sagt, warum das keine gute Idee ist, wieso Smart-Pointer im Container vielleicht doch besser sind und und und.
Es kamen aber keine gezielten Fragen sondern nur Bullshit.
-
sdfsdfggg schrieb:
Client hat eine dynamische Ressource zu verwalten, die im Ctor aquiriert wird, und im Dtor freigegeben werden soll
Also RAII/RRID. OK.
sdfsdfggg schrieb:
Nun, dynamische Ressource heißt ja, dass ich sehr vorsichtig bei Kopien sein muss, und da ich Fenster/Clients (ist das gleiche, das eine ist X-Lib-Terminologie) in einem beliebigen STL-Container verwalten möchte, wird das komplizierter.
Jain. Man kann RAII Objekte wunderbar kopieren und in Collections tun. Beispielsweise
std::string. Man muss nur damit klarkommen dass beim Kopieren u.U. ne Exception fliegen kann.In deinem Beispiel ist allerdings primär erstmal 'was anderes relevant. Nämlich dass es überhaupt keinen Sinn macht so etwas wie eine "ConnectedClient" Klasse zu kopieren. Weil die konzeptuell nicht kopierbar ist. Weil ja nicht magisch eine neue Connection mit einem neuen Client dran entsteht wenn du das "ConnectedClient" Objekt kopierst. Zu der Frage ob es wegen dynamische Ressource schwierig wird oder nicht kommt man also gar nicht mehr.
Form follows function, nicht umgekehrt.sdfsdfggg schrieb:
Einfachstes Beispiel: Ich packe Client* in einen Container und Problem gelöst. Lösche ich ein Client, gibt der Speicher frei und gut ist. Ich will aber keine Rawptr.
Ja, gute Entscheidung. Besitzende Raw-Pointer sind böse (fehleranfällig). Und collections aus besitzenden Raw-Pointern sind nöch mehr böse.
sdfsdfggg schrieb:
Mein Ziel und meine Lösung momentan:
std::container<client> clients
Das erreiche ich indem ich copy ctor (es ergibt genau NULL Sinn Clients zu kopieren, es gibt nur ein physisches Fenster, und dazugehörige dynamische Daten duplizieren ergibt auch null Sinn) und Assignment verbiete. Dann hab ich den Move-Ctor definiert und nun geht sowas wie:
clients.push_back(std::move(client(...));
Damit wird der Client-Ctor exakt einmal aufgerufen, ich kann Daten aquirieren und im Dtor freigeben. Die Lösung fine ich fast okay, denn ich habe simpel verständlich eine authoritative Liste aller Fenster, die sich autonom um die dynamische Daten kümmern, wenn ich sie aus dem Container werfe und gut ist. Bis auf dass ich einige Mechaniken rundrum nicht verstehe.
Diese Lösung habe ich mir zusammen geschustert und ich hatte eigentlich gehofft mir schlägt jemand sowas vor oder sagt, warum das keine gute Idee ist, wieso Smart-Pointer im Container vielleicht doch besser sind und und und.
Also...
Movable... hm. Ja, kann man machen. Muss man in dem Fall aber nicht. Weil es auch nicht ganz ungefährlich ist.Wenn du als
std::containerz.B.std::vectorwählst, dann musst du damlit leben dassstd::vectorhin und wieder mal ne Reallocation machen wird. Dabei werden dann alle Objekte verschoben. Dabei verändern sich ihre Adressen. Bzw. auch einfach wenn du in der Mitte ein Objekt rauslöscht.Das heisst dann dass du z.B. nicht in einem Thread ein Client Objekt verwenden darfst, während du in einem anderen ein neues einfügst oder ein bestehendes löscht. Das kann egal sein (wenn alles single threaded ist, und es keine Callbacks gibt die zum "unpassenden" Zeitpunkt aufgerufen werden könnten). Es kann aber auch wichtig sein.
Generell mache ich Objekte ersmtal noncopyable UND nonmovable wenn sie konzeptuell nicht kopierbar sind. Weil es Kopfschmerzen spart. Wie bei jeder Faustregel wird es Ausnahmen geben wo es sinnvoll ist 'was anderes zu machen, aber bisher sind mir da keine begegnet.
D.h. ich würde einfach mal sowas wie
vector<unique_ptr<Client>>machen. Bzw. u.U. auchmap<SomeKeyType, unique_ptr<Client>>, wenn du z.B. sowieso die Möglichkeit brauchst nen Client anhand irgend einer ID rauszusuchen.Bei
map<>könnte man jetzt natürlich sagen: OK, beimapmüssen die Objekte sowieso nicht kopiert werden, und auch nicht verschoben, da kann man ja mitemplacearbeiten, und damit brauchen wir denunique_ptrnicht mehr. Könnte man sagen. Würde ich aber auch nicht machen. Und zwar weil du damit die komplette Konstruktionsphase des Client in denemplaceAufruf hineinverlagerst. Mit Multithreading wäre das wieder doof, weil du dann über den gesamten Zeitraum den der Client Ctor benötigt diemapgelockt halten müsstest.Bei
map<SomeKeyType, unique_ptr<Client>>hingegen lässt sich das leicht vermeiden: du konstruierst erstmal ganz gemütlich den neuen Client und verschiebst dann einfach denunique_ptrin die Map rein. (Hier ist es dann auch kein Problem wenn verschoben wird, da ja nur derunique_ptrverschoben wird - die Adresse des Client Objekts ändert sich ja deswegen nicht.)sdfsdfggg schrieb:
Es kamen aber keine gezielten Fragen sondern nur Bullshit.
Naja... die Frage die du in diesem Beitrag jetzt gestellt hast, hast du bisher einfach nicht gestellt. Dein erster Beitrag hier hat den Fokus recht deutlich auf die Sache mit den Desktops gelegt, das Thema wer sollte wen kennen usw. Davon ist hier jetzt auf einmal nicht mehr die Rede. Statt dessen stellst du eine ziemlich konkrete Frage, die ich dadurch auch (hoffentlich) ziemlich konkret beantworten konnte.
ps:
Bis auf dass ich einige Mechaniken rundrum nicht verstehe.
Da du nicht näher darauf eingehst, gehe ich mal davon aus dass dich das nicht weiter stresst dass du "einige Mechaniken rundrum" nicht verstehst. Falls doch, dann frag gerne nach. Wenn du konkret schreibst welche Mechaniken du nicht verstehst, dann wird sich sicher jemand finden der es dir erklärt.
-
solange klar ist, dass der container diese resource verwaltet, ist diese lösung standard. sobald das nicht mehr der fall ist, verwende unique_ptr und rohe zeiger, evtl. mit einem marker in der art "non_owning<T>".
lächerlich ist allerdings, dass du ursprünglich gefragt hast:
"Wie modelliere ich sowas konkret und ordentlich?" - ganz allgemein, und darauf auch antworten bekommen hast. weißt du, wenn sich hier ab und zu mal leute mit schwierigeren fragen und komplexen constraints (X-lib) herumplagen, dann ist das eher die ausnahme - ohne kontext gehe ich mal davon aus, dass mein gegenüber (fast) gar keine ahnung hat. wie du dich darüber so sehr aufregen kannst, ist mir völlig unverständlich.