Was macht man mit solch einer Fehlermeldung?



  • Mehr Code, bitte. Dass die Klasse einfach keinen Default-Konstruktor hat, kann eigentlich nicht sein, weil er dann einfach nicht existiert, und nicht deleted ist. Vielleicht enthält die Klasse Referenzen oder const Membervariablen.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Der Compiler wird schon recht haben. Du übersiehst irgendetwas oder machst irgendetwas an falscher Stelle.

    Das ist schon klar, aber ich habe keine Vorstellung was das sein könnte. Die betreffende Klasse schaut so aus:

    template<typename T>
    class Rect
    {
    	using val_t = T;
    public:
    	Rect() = default;
    	Rect(const val_t x0, const val_t y0, const val_t x, const val_t y)
    		: p0_{ x0, y0 }, p_{ x, y } {}
    	Rect(const Point2D<val_t>& p0, const Point2D<val_t>& p)
    		: p0_{ p0 }, p_{ p } {}
    
    	val_t left() const { return p0_.x(); }
    	val_t bottom() const { return p0_.y(); }
    	val_t right() const { return p_.x(); }
    	val_t top() const { return p_.y(); }
    	val_t& left() { return p0_.x(); }
    	val_t& bottom() { return p0_.y(); }
    	val_t& right() { return p_.x(); }
    	val_t& top() { return p_.y(); }
    
    	Point2D<val_t> p0() const { return p0_; }
    	Point2D<val_t> p() const { return p_; }
    	Point2D<val_t>& p0() { return p0_; }
    	Point2D<val_t>& p() { return p_; }
    
    private:
    	const Point2D<val_t>& p0_; //EDIT: oh, ich Idiot! Das sehe ich jetzt erst!?
    	const Point2D<val_t>& p_ //Da muss ich ja ganz schön verhuscht gewesen sein!
    };
    

    Selbst wenn sie im eigenen Header ist, kann ich sie nicht mal im der main() aufrufen.

    EDIT: siehe Edit. Ich glaub ich muss zum Augenarzt.



  • @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    const Point2D<val_t>& p0_;

    Was soll ein Defaultkonstruktor damit machen?



  • Jepp. Mir selbst unvorstellbar, wie ich das nicht gesehen habe. Sorry für die Aufregung.


  • Mod

    Deine Schnittstelle ist allgemein konfus. Du öffnest deine privaten const Referenzen zum unkontrollierten Schreiben? Oder umgekehrt gesehen: Du hast const-Referenz-Member?
    Ich habe den Eindruck, du möchtest eher

    struct Rect
    {
        Point2D p0, p_;
    };
    

    Vielleicht noch angereichert mit den top, left, bottom, right Methoden.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Point2D p0, p_;

    Machen dann nicht vielleicht auch Point2D topleft, bottomright; oder Point2d bottomleft, topright mehr Sinn als p0 und p?



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Deine Schnittstelle ist allgemein konfus.

    Ich habe hier noch keinen Code gesehen, der ohne spitze Bemerkungen durchgekommen ist. Wenn er nicht zu meinem Projekt passt, werde ich es schon selbst erfahren. Mit "konfus" kann ich jedenfalls herzlich wenig anfangen, weshalb ich mir darum jetzt auch keinen Kopf machen werde.


  • Mod

    @wob sagte in Was macht man mit solch einer Fehlermeldung?:

    @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Point2D p0, p_;

    Machen dann nicht vielleicht auch Point2D topleft, bottomright; oder Point2d bottomleft, topright mehr Sinn als p0 und p?

    Vielleicht. Ich war mir nicht so sicher, was die Absicht hinter der Klasse sein soll (was halt genau das Problem ist, dass sich ein Leser nicht sicher ist). Geht es um schnöde Speicherung von zwei Punkten? Oder geht es um die Verbindung zwischen den internen Daten und der semantischen Interpretation als Rechteck mit den Konzepten von ausgerichteten Seiten und Ecken?



  • Es geht MIR darum, ein sicheres Konstrukt aus vier Werten zu haben, ohne unsicher zu sein, wie x0, y0 etc zu deuten ist.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Ich habe hier noch keinen Code gesehen, der ohne spitze Bemerkungen durchgekommen ist. Wenn er nicht zu meinem Projekt passt, werde ich es schon selbst erfahren. Mit "konfus" kann ich jedenfalls herzlich wenig anfangen, weshalb ich mir darum jetzt auch keinen Kopf machen werde.

    Konfus: Selbstwiedersprüchlich. Du hast const-Member, bietest aber ausdrücklich Funktionen zu deren Veränderung an. Was nicht funktionieren wird. Deshalb wird es auch nicht lange dauern, bis du mit deinem unbesorgten Kopf gegen die Wand rennst.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Du hast const-Member,

    const-Member? Du meinst die fehlerhafte Zeile const Point2D<val_t>& p0_;?


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Es geht MIR darum, ein sicheres Konstrukt aus vier Werten zu haben, ohne unsicher zu sein, wie x0, y0 etc zu deuten ist.

    Dann lass doch die Schnittstelle zu x0, y0, etc. weg und biete nur die high-Level Interpretation mit "links", "rechts", etc an! Wie das Rechteck intern repräsentiert ist, sollte kein Teil der öffentlichen Schnittstelle sein. Wenn es nämlich Teil der öffentlichen Schnittstelle ist, dann kannst du die interne Repräsentation in Zukunft nicht mehr ändern, weil du dann allen abhängigen Code kaputt machen würdest.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Du hast const-Member,

    const-Member? Du meinst die fehlerhafte Zeile const Point2D<val_t>& p0_;?

    Welche Eigenschaften deiner Klasse nun falsch sind und welche richtig, kannst nur du wissen. Ich als Leser kann nur sagen, dass die gezeigten Eigenschaften widersprüchlich sind und daher mindestens eine davon falsch sein muss.



  • Ich würde die Klasse aber gerne auch mit vier Werten füllen. Ich habe sie zu meiner eigenen Erleichterung geschrieben, weil mir die vier Werte auf Dauer zu undurchsichtig wurden.



  • @SeppJ sagte in Was macht man mit solch einer Fehlermeldung?:

    Welche Eigenschaften deiner Klasse nun falsch sind und welche richtig, kannst nur du wissen. Ich als Leser kann nur sagen,

    Jesus! Das war der Fehler, keine Absicht! Ehrlich, machmal frickelt man lieber eine Woche an einem Problem herum, als sich hier zu melden.


  • Mod

    Du hast offenbar nicht verstanden, was ich dir sagen möchte, was an deinem Design nicht stimmt. Vermutlich aus irgendeinem falsch verstandenem Ehrgefühl, dass das Aufzeigen einer Schwäche in deinem Code irgendwie als persönlichen Angriff wahr nimmt, anstatt inhaltlich über die Kritik nachzudenken.



  • Nein, das hat nichts mit Ehre zu tun, sondern, das die Kritik ziellos ist. Du sagst, konfus, weil ich einen const-Member habe. Ich sage, das war der Fehler. Was war denn noch, was ich jetzt an Verbesserungsvorschlägen überlesen habe?



  • Ihr müsst bedenken, Ihr arbeitet professionell, mache vielleicht sogar als Profs. Ihr könnt Eure Kenntnisse nicht vorrausetzen bei Leuten, die das nebensächlich aus Interesse betreiben.



  • @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    	val_t& left() { return p0_.x(); }
    	val_t& bottom() { return p0_.y(); }
    	val_t& right() { return p_.x(); }
    	val_t& top() { return p_.y(); }
    

    Ich finde das hier recht ungewöhnlich. Generell ist es sehr unüblich (nicht-const-)Referenzen auf private Member rauszugeben, wohingegen const-Referenzen absolut state-of-the-art sind.

    Wenn du private Member ändern willst, solltest du eine Setter dafür anlegen, oder eben irgendeine Funktion die Daten verarbeitet und anhand der Daten indirekte diese privaten Member verändert. Abhängig davon was genau die Aufgabe deiner Klasse ist.
    Wenn die Klasse nur ein Container ist, dann reicht ein Setter, wenn die Klasse aber komplexere Aufgaben übernimmt ( ein Parser z.B. ) dann ist beispielsweise "handleMyData( const MyBigData & )"-Funktion, die dann indirekt zur Veränderung deiner privaten Member führt auch sinnvoll.


  • Mod

    @zeropage sagte in Was macht man mit solch einer Fehlermeldung?:

    Nein, das hat nichts mit Ehre zu tun, sondern, das die Kritik ziellos ist. Du sagst, konfus, weil ich einen const-Member habe. Ich sage, das war der Fehler. Was war denn noch, was ich jetzt an Verbesserungsvorschlägen überlesen habe?

    Der ursprüngliche Fehler war nicht, dass dein Member const ist, sondern eine Referenz. Da du gesagt hast, dass du den Fehler behoben hast, aber nicht wie, ist nicht klar, ob er noch const ist oder nicht. Wenn du jetzt sagst, es war ein Fehler, dass es auch falsch ist, dass er const ist, dann habe ich doch Recht gehabt, dass es entweder falsch ist, dass er const ist, oder an anderer Stelle beschrieben wird.

    Die andere Kritik ist, dass deine Klasse zwei Aufgaben erfüllt: Einerseits bietet sie ein low-level Interface zum Speichern von zwei Punkten an (p, p0), andererseits die High-Level Interpretation als Rechteck mit Ecken und Kanten (left, top, etc.). Die High-Level Abstraktion sollte nicht das Implementierungsdetails nach außen geben, dass das Rechteck intern als zwei Punkte gespeichert ist. Sonst bist du für alle Zeiten an dieses spezielle interne Detail gebunden.
    Vorschlag: Eine Klasse zur Speicherung und Manipulation von zwei Punkten, und eine andere Klasse für reine Rechtecklogik, die die Zweipunktklasse (oder halt auch etwas anderes!) intern benutzt. Wobei die Zweipunktklasse wahrscheinlich keine "richtige" selbstgeschriebene Klasse sein braucht, weil ein typedef auf ein Zwei-Punkte-Array die Funktionalität quasi perfekt abbildet


Anmelden zum Antworten