FLTK, C++, Stroustrup Buch



  • Hallo zusammen,

    ich arbeite im Moment an dem Buch Programming Principles and Practise using C++ von Stroustrup. Falls jemand das Buch kennt es geht um Kapitel 13.6 Open Polyline.

    Folgender Code wird sollte Funktionieren (so abgedruckt im Buch):

    #include "Graph.h"
    #include "Simple_window.h"
    
    int main()
    {
        using namespace Graph_lib;
        
        Graph_lib::Open_polyline opl = {
            Point{100,100}, Point{150,200}, Point{250,250}, Point{300,200}
        };
            win.attach(opl);
            win.wait_for_button();
    }
    
    

    Die Definition von Open_polyline sieht so aus:

    struct Open_polyline : Shape {   // open sequence of lines
    using Shape::Shape;                 // use Shape’s constructors (§A.16)
    void add(Point p) { Shape::add(p); }
    };
    

    Beim Erstellen bekomme ich folgende zwei Fehler:

    Auf ""Graph_lib::Open_polyline::Open_polyline(std::initializer_list<Graph_lib::Point> lst)" (implizit deklariert)" kann nicht zugegriffen werden.

    "Graph_lib::Open_polyline::Open_polyline": Kein Zugriff auf protected Member, dessen Deklaration in der Graph_lib::Open_polyline-Klasse erfolgte.

    Ich komme einfach nicht dahinter was ich tun muss damit es geht. Könnt ihr mir helfen mich an das Problem heranzutasten/ mir aushelfen?



  • Welchen Compiler (und welche C++ Sprachversion) benutzt du?



  • Ich nutze Visual Studio 2019, es müsste also mind. C++14 sein. Wie der Compiler heist weis ich ehrlich gesagt nicht, das müsste ich erst recherchieren.



  • Dann zeige mal die Deklaration der Shape-Konstruktoren (da diese ja mittels using Shape::Shape; vererbt werden).

    Kompiliert denn die Benutzung der Basisklasse?

    Graph_lib::Shape shape = {
            Point{100,100}, Point{150,200}, Point{250,250}, Point{300,200}
    };
    

    PS: Das ist dann der Microsoft Visual C++ (MSVC).



  • @zipehpa wie lautet die vollständige Fehlermeldung im Outputtab (wie auch immer das in deiner eingedeutschten Version heißt)?



  • Klar gerne:

    class Shape  {	// deals with color and style, and holds sequence of lines
    protected:
    	Shape() { }
    	Shape(initializer_list<Point> lst);  // add() the Points to this Shape
    

    Mehr sind es nicht.



  • @manni66 sagte in FLTK, C++, Stroustrup Buch:

    @zipehpa wie lautet die vollständige Fehlermeldung im Outputtab (wie auch immer das in deiner eingedeutschten Version heißt)?

    Hallo manni66:
    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\main.cpp(45,22): error C2248: "Graph_lib::Open_polyline::Open_polyline": Kein Zugriff auf protected Member, dessen Deklaration in der Graph_lib::Open_polyline-Klasse erfolgte.

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Graph.h(218): message : Compiler hat hier "Graph_lib::Open_polyline::Open_polyline" generiert

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Graph.h(217): message : Siehe Deklaration von "Graph_lib::Open_polyline"



  • @zipehpa sagte in FLTK, C++, Stroustrup Buch:

    @manni66 sagte in FLTK, C++, Stroustrup Buch:

    @zipehpa wie lautet die vollständige Fehlermeldung im Outputtab (wie auch immer das in deiner eingedeutschten Version heißt)?

    Hallo manni66:
    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\main.cpp(45,22): error C2248: "Graph_lib::Open_polyline::Open_polyline": Kein Zugriff auf protected Member, dessen Deklaration in der Graph_lib::Open_polyline-Klasse erfolgte.

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Graph.h(218): message : Compiler hat hier "Graph_lib::Open_polyline::Open_polyline" generiert

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Graph.h(217): message : Siehe Deklaration von "Graph_lib::Open_polyline"

    Warum stehen hier nicht die gleichen Texte wie im ersten Beitrag?



  • Wenn ich in Using-declaration den Abschnitt "Inheriting constructors" richtig verstehe, dann sollten die Zugriffsmodifizierer erhalten bleiben. Da die Shape-Konstruktoren als protected deklariert wurden, sind auch die daraus erzeugten Open_polyline-Konstruktoren protected.
    Ändere es mal in:

    class Shape  {	// deals with color and style, and holds sequence of lines
    public: // <- was protected
    	Shape() { }
    	Shape(initializer_list<Point> lst);  // add() the Points to this Shape
    

    Das würde auch die Fehlermeldung (bzgl. "Kein Zugriff auf protected Member") erklären. Und auch der gcc erzeugt einen Fehler: Ideone-Code



  • Hallo manni66, die Meldungen sind identisch wie bei meinem ersten Post, man muss unterscheiden zwischen Fehlerliste und Ausgabe, das habe ich vergessen. Hier nochmal alles:

    Tab "Fehlerliste"
    E0330 Auf ""Graph_lib::Open_polyline::Open_polyline(std::initializer_list<Graph_lib::Point> lst)" (implizit deklariert)" kann nicht zugegriffen werden. Alle_Kapitel D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\main.cpp 45

    C2248 "Graph_lib::Open_polyline::Open_polyline": Kein Zugriff auf protected Member, dessen Deklaration in der Graph_lib::Open_polyline-Klasse erfolgte. Alle_Kapitel D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\main.cpp 45

    Tab "Ausgabe"
    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\main.cpp(45,22): error C2248: "Graph_lib::Open_polyline::Open_polyline": Kein Zugriff auf protected Member, dessen Deklaration in der Graph_lib::Open_polyline-Klasse erfolgte.

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Graph.h(218): message : Compiler hat hier "Graph_lib::Open_polyline::Open_polyline" generiert

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Graph.h(217): message : Siehe Deklaration von "Graph_lib::Open_polyline"



  • Ändere es mal in:

    class Shape  {	// deals with color and style, and holds sequence of lines
    public: // <- was protected
    	Shape() { }
    	Shape(initializer_list<Point> lst);  // add() the Points to this Shape
    

    Das hat etwas bewirkt, jetzt bekomme ich andere Fehlermeldungen.

    TAB Fehlerliste:
    LNK2001 Nicht aufgelöstes externes Symbol ""public: __thiscall Graph_lib::Shape::Shape(class std::initializer_list<struct Graph_lib::Point>)" (??0Shape@Graph_lib@@QAE@V?$initializer_list@UPoint@Graph_lib@@@std@@@Z)". Alle_Kapitel D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\main.obj 1

    LNK1120 1 nicht aufgelöste Externe Alle_Kapitel D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Release\Alle_Kapitel.exe 1

    TAB Ausgabe
    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Graph.h(103): message : beim Kompilieren der Klasse Vorlage-Memberfunktion "Graph_lib::Vector_ref<Graph_lib::Button>::~Vector_ref(void)"

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\GUI.h(97): message : Siehe Verweis auf die gerade kompilierte Instanziierung "Graph_lib::Vector_ref<Graph_lib::Button>::~Vector_ref(void)" der Funktions-Vorlage.

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\GUI.h(99): message : Siehe Verweis auf die gerade kompilierte Klasse Vorlage-Instanziierung "Graph_lib::Vector_ref<Graph_lib::Button>".

    1>main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall Graph_lib::Shape::Shape(class std::initializer_list<struct Graph_lib::Point>)" (??0Shape@Graph_lib@@QAE@V?$initializer_list@UPoint@Graph_lib@@@std@@@Z)".

    1>D:\DEV C++\PPPC++\Kap13\Alle_Kapitel\Release\Alle_Kapitel.exe : fatal error LNK1120: 1 nicht aufgelöste Externe



  • @Th69 sagte in FLTK, C++, Stroustrup Buch:

    Wenn ich in Using-declaration den Abschnitt "Inheriting constructors" richtig verstehe, dann sollten die Zugriffsmodifizierer erhalten bleiben.

    Du verstehst das richtig. Das finde ich jetzt auch überraschend.



  • @zipehpa gibt es da neben Graph.h auch noch ein Graph.cpp? Dann musst die die Datei deinem Projekt hinzufügen.

    Woher stammt der Code? Gibt es da einen Dowloadlink?



  • @manni66 sagte in FLTK, C++, Stroustrup Buch:

    gibt es da neben Graph.h auch noch ein Graph.cpp? Dann musst die die Datei deinem Projekt hinzufügen.

    Alle Pfade sind korrekt eingestellt und alle Dateien dem Projekt zugeordnet.
    Wenn ich nur die beiden Linien zeichnen lasse funktioniert alles, sobald ich die Open Polyline zeichnen will kommen die Fehlermeldungen, auch bei Closed Polyline.

    Woher stammt der Code? Gibt es da einen Dowloadlink?

    Das ist der Originalcode von www.stroustrup.com

    Ich würde gerne ein paar Screenshots bzw. die Dateien/das Projekt hochladen aber das geht irgendwie nicht.



  • @zipehpa sagte in FLTK, C++, Stroustrup Buch:

    Das ist der Originalcode von www.stroustrup.com

    Beware: this is code recovered from a loss of my previous website and my contain errors. Bug fixes and corrections are welcome.

    Dann fehlt da wohl die Funktion.



  • @manni66 Ja das habe ich auch gelesen. D.h. ich kann jetzt einfach kapitel 12- 16 vergessen weil er zu bequem ist seinen Support zu machen? Von jemandem wie Stroustrup erwarte ich irgendwie mehr.



  • @zipehpa wenn das alles ist was fehlt. ergänze den Konstruktor im Header:

    Shape(initializer_list<Point> lst) : points(lst.begin(), lst.end()) {}

    statt

    Shape(initializer_list<Point> lst);



  • @manni66 sagte in FLTK, C++, Stroustrup Buch:

    @zipehpa wenn das alles ist was fehlt. ergänze den Konstruktor im Header:
    Shape(initializer_list<Point> lst) : points(lst.begin(), lst.end()) {}
    statt
    Shape(initializer_list<Point> lst);

    Der Wahnsinn es funktioniert 🙂 Wie bist du denn darauf gekommen? War das so offensichtlich? Ich wäre da nicht drauf gekommen.



  • @zipehpa sagte in FLTK, C++, Stroustrup Buch:

    War das so offensichtlich?

    Ja


Anmelden zum Antworten