Funktion soll andere Funktion aufrufen
-
Kannst du uns mal den Konstruktor von Circle zeigen? Anscheinend gibt es ja keinen derartigen Konstruktor von Smiley.
-
wxSkip schrieb:
Kannst du uns mal den Konstruktor von Circle zeigen? Anscheinend gibt es ja keinen derartigen Konstruktor von Smiley.
Ja:
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; };Wenn ich denn gleichen Konstrutor definiere dann gibt es keine Fehler nur das Programm läst sich nicht Compilieren und ausführen.
Fehler 9 error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall Smiley::Smiley(struct Point,int,int)" (??0Smiley@@QAE@UPoint@@HH@Z)".
Fehler 10 error LNK1120: 1 nicht aufgelöste externe Verweise.
-
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.
-
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.hstruct 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.