Was macht man mit solch einer Fehlermeldung?


  • Mod

    Der Compiler wird schon recht haben. Du übersiehst irgendetwas oder machst irgendetwas an falscher Stelle. Ohne Code kann man nichts konkretes sagen. Erstell' doch bitte ein (bis auf den Fehler) compilierbares Minimalbeispiel, das möglichst keine Codezeile enthält die nichts mit dem Fehler zu tun hat. Und poste das dann hier, dann werden wir den Fehler schnell finden. Wobei sich solche Probleme erfahrungsgemäß auch oft von alleine lösen, weil man beim Reduzieren des Codes den Fehler selber findet.



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


Anmelden zum Antworten