Funktion soll andere Funktion aufrufen



  • wxSkip schrieb:

    winux schrieb:

    Wenn ich denn gleichen Konstrutor definiere dann gibt es keine Fehler nur das Programm läst sich nicht Compilieren und ausführen.

    Das ist ein Paradoxon. Versuch mal einen Konstruktor zu machen, der einfach den Konstruktor von Circle aufruft.

    EDIT: Du hast den Konstruktor nur deklariert, nicht definiert oder jedenfalls nicht gelinkt.

    So etwas? Smiley::Circle;



  • winux schrieb:

    wxSkip schrieb:

    winux schrieb:

    Wenn ich denn gleichen Konstrutor definiere dann gibt es keine Fehler nur das Programm läst sich nicht Compilieren und ausführen.

    Das ist ein Paradoxon. Versuch mal einen Konstruktor zu machen, der einfach den Konstruktor von Circle aufruft.

    EDIT: Du hast den Konstruktor nur deklariert, nicht definiert oder jedenfalls nicht gelinkt.

    So etwas? Smiley::Circle;

    Nein.

    Smiley::Smiley(Point p, int rr)
      : Circle(p, rr)
    {
    }
    


  • wxSkip schrieb:

    winux schrieb:

    wxSkip schrieb:

    winux schrieb:

    Wenn ich denn gleichen Konstrutor definiere dann gibt es keine Fehler nur das Programm läst sich nicht Compilieren und ausführen.

    Das ist ein Paradoxon. Versuch mal einen Konstruktor zu machen, der einfach den Konstruktor von Circle aufruft.

    EDIT: Du hast den Konstruktor nur deklariert, nicht definiert oder jedenfalls nicht gelinkt.

    So etwas? Smiley::Circle;

    Nein.

    Smiley::Smiley(Point p, int rr)
      : Circle(p, rr)
    {
    }
    

    Danke das wahr eine große Hilfe.

    Die Änderung in der Header:

    struct Smiley:Circle
    {
    	Smiley::Smiley(Point p, int r) : Circle(p, r)
    	{
    		add(Point(p.x-r,p.y-r));
    	}
    	void draw_lines() const;
    private:
    	int r;
    };
    
    void Smiley::draw_lines() const    
    {
    	if (color().visibility())
    		fl_arc(point(0).x,point(0).y,r+r,r+r,0,360);   
    }
    


  • Das Smiley:: kannst du innerhalb der Klassendefinition weglassen. Schreib deine Funktionen lieber in eine Sourcedatei.



  • Jetzt aber gibt es folgendes Problem der Kreis wird nicht gezeichent.
    Habe dies Änderungen gemacht.
    Outline.h

    struct Smiley:Circle
    {
    	Smiley(Point p, int r) : Circle(p, r)
    	{
    		add(Point(p.x-r,p.y-r));
    	}
    	void draw_lines() const;
    	Point center() const 
    	{
    		return Point(point(0).x+r, point(0).y+r);
    	}
    	int radius() const { return r; }
        void set_radius(int rr) { r=rr; }
    private:
    	int r;
    };
    
    void Smiley::draw_lines() const    
    {
    	if (color().visibility())
    		fl_arc(point(0).x,point(0).y,r+r,r+r,0,360);   
    }
    

    Die Deklaration und Definition von Circle:

    struct Circle : Shape {
        Circle(Point p, int rr);    // center and radius
    
        void draw_lines() const;
    
        Point center() const ; 
        int radius() const { return r; }
        void set_radius(int rr) { r=rr; }
    private:
        int r;
    };
    
    Circle::Circle(Point p, int rr)    // center and radius
    :r(rr)
    {
        add(Point(p.x-r,p.y-r));       // store top-left corner
    }
    
    //------------------------------------------------------------------------------
    
    Point Circle::center() const
    {
        return Point(point(0).x+r, point(0).y+r);
    }
    
    //------------------------------------------------------------------------------
    
    void Circle::draw_lines() const
    {
        if (color().visibility())
            fl_arc(point(0).x,point(0).y,r+r,r+r,0,360);
    }
    


  • Hm... ich nehme an, der Mund wird gezeichnet, aber der Kreis nicht. Du solltest in diesem Fall Circle::draw_lines() in deine Shape::draw_lines()-Funktion einfügen.



  • wxSkip schrieb:

    Hm... ich nehme an, der Mund wird gezeichnet, aber der Kreis nicht. Du solltest in diesem Fall Circle::draw_lines() in deine Shape::draw_lines()-Funktion einfügen.

    Alles wird gezeichnet nur wenn ich Smiley wird nicht gezeichnet, die Circle Objekte schon. Also Kopf und die zwei Augen werden gezeichnet, aber der Mund nicht.



  • Ist die Lösung nicht das?

    Circle::Circle(Point p, int rr)    // center and radius 
    :r(rr) // dieses Initialisierung 
    { 
        add(Point(p.x-r,p.y-r));       // store top-left corner 
    }
    


  • winux schrieb:

    wxSkip schrieb:

    Hm... ich nehme an, der Mund wird gezeichnet, aber der Kreis nicht. Du solltest in diesem Fall Circle::draw_lines() in deine Shape::draw_lines()-Funktion einfügen.

    Alles wird gezeichnet nur wenn ich Smiley wird nicht gezeichnet, die Circle Objekte schon. Also Kopf und die zwei Augen werden gezeichnet, aber der Mund nicht.

    Wo soll der Mund denn herkommen? Beide draw_lines()-Funktionen sehen genau gleich aus.



  • wxSkip schrieb:

    winux schrieb:

    wxSkip schrieb:

    Hm... ich nehme an, der Mund wird gezeichnet, aber der Kreis nicht. Du solltest in diesem Fall Circle::draw_lines() in deine Shape::draw_lines()-Funktion einfügen.

    Alles wird gezeichnet nur wenn ich Smiley wird nicht gezeichnet, die Circle Objekte schon. Also Kopf und die zwei Augen werden gezeichnet, aber der Mund nicht.

    Wo soll der Mund denn herkommen? Beide draw_lines()-Funktionen sehen genau gleich aus.

    OK, da habe ich ein Fehler gemacht. Habe jetzt Smiley draw_lines() geändert. Auch wenn ich s4.draw_lines() aufrufe wird nichts gezeichnet.



  • Zeig mal den neuen Code. Wird wieder kein Mund gezeichnet? Oder gar nichts?



  • Vielleicht verstehe ich die Übung nicht. Das ist keine Hausaufgabe, die Übung kommst aus einen Buch. So lautet die Übung:

    Definieren Sie zwei Klassen names Smiley und Frowny, die beide von der Klasse Circle abgeleitet sind und je zwei Augen und einen Mund aufweisen. Leiten Sie danach Klasssen von Smiley und Frowny ab, die jedem Kreisgesicht einen passenden Hut aufsetzen.



  • int main()
    {
        using namespace Graph_lib;
    
    	Point tl(100,100);
    
    	Simple_window win1(tl,600,400,"Face");
    
    	Circle s1(Point(250,170),150);    // Kopf
    	Circle s2(Point(170,150),30);     // Auge
    	Circle s3(Point(330,150),30);     // Auge
    
        Smiley s4(Point(210,220),90);  // hier sollte es den Mund zeichen 
    	s4.draw_lines();
    
    	win1.attach(s1);
    	win1.attach(s2);
    	win1.attach(s3);
    	win1.attach(s4);
    
    	win1.wait_for_button();
    }
    
    struct Smiley:Circle
    {
    	Smiley(Point p, int r) : Circle(p, r) 
    	{
    		add(Point(p.x-r,p.y-r));
    	}
    	void draw_lines() const;
    	Point center() const 
    	{
    		return Point(point(0).x+r, point(0).y+r);
    	}
    	int radius() const { return r; }
        void set_radius(int rr) { r=rr; }
    private:
    	int r;
    };
    
    void Smiley::draw_lines() const    
    {
    	if (color().visibility())
    		fl_arc(point(0).x,point(0).y,r+r,r+r,0,180);   
    }
    


  • Passiert die Zeichnung der anderen Objekte bei attach()?



  • wxSkip schrieb:

    Passiert die Zeichnung der anderen Objekte bei attach()?

    Ja alles wird gezeichnet nur Smiley nicht.



  • Denke es fehlt noch etwas damit es gezeichnet wird.



  • winux schrieb:

    wxSkip schrieb:

    Passiert die Zeichnung der anderen Objekte bei attach()?

    Ja alles wird gezeichnet nur Smiley nicht.

    Und warum versuchst du dann, s4 schon vor attach() zu zeichnen?
    Mach doch mal irgendwelche Test-Ausgaben in draw_lines() rein.



  • Habe mal in eine andere Übung geschaut wie ich nur teil von kreißen gezeichnet habe. Also draw_lines() muss ich nicht aufrufen, es genügte alles in der Header zu deklarien und definieren und es wurde gezeichnet. Oder sollte ich das Programm komplett neu schreiben?



  • winux schrieb:

    Habe mal in eine andere Übung geschaut wie ich nur teil von kreißen gezeichnet habe. Also draw_lines() muss ich nicht aufrufen, es genügte alles in der Header zu deklarien und definieren und es wurde gezeichnet. Oder sollte ich das Programm komplett neu schreiben?

    Ja was jetzt? Funktioniert es oder nicht?



  • wxSkip schrieb:

    winux schrieb:

    Habe mal in eine andere Übung geschaut wie ich nur teil von kreißen gezeichnet habe. Also draw_lines() muss ich nicht aufrufen, es genügte alles in der Header zu deklarien und definieren und es wurde gezeichnet. Oder sollte ich das Programm komplett neu schreiben?

    Ja was jetzt? Funktioniert es oder nicht?

    Nein, doch die Lösung ist etwas anderes. Um etwas zu zeichnen muss man die Hauptklasse Shape nutzen. Nur mit Shape kann man zeichnen ohne Shape geht es nicht. Habe mal zurückgeblättert im Buch. Das heißt nichts anderes als neu Design des Programmes. Nochmals bedanke ich mich für deine Hilfe und mühe, entschuldige das ich es den Fehler nicht schön früher gemerkt habe. Aber dann ergibt die Übung doch keine sin. Wie solle etwas gezeichnet werden ohne das man Shape nutzt.


Anmelden zum Antworten