Konstruktor einer Unterklasse schreiben !



  • hallo liebe leute ich möchte im Prinzip nur den Konstruktor der Unterklasse definieren , allerdings bekomme ich dann folgende Meldung :

    /Aufgabe 3 Abgabe/Figure.cpp:27: error: expected primary-expression before 'double'

    An dieser Stelle bekomme ich die Fehlermeldung in der figure.h

    circle::circle(double rad):figure(double k,double v)
    
    {
    
    }
    

    In der Figure cpp habe ich folgenden Code

    class figure 
    
    {
        protected:
    	double x ;
    	double y ; 
    
    	public:
    	figure(double k,double v);
    	~figure();
    	virtual void print();
    
    };
    
    class circle : public figure 
    
    {
    	private: 
    	double r ;
    
    	public:
    	circle(double rad);
    	~circle();
    	void print();
    
    };
    


  • circle::circle(double rad):figure(double k,double v)
    

    Das geht so natürlich nicht.
    Du willst ja die Basis initialisieren und dazu musst du dem entsprechenden Konstruktor der Basisklasse Werte übergeben.

    Die Schnittstelle ist dafür recht problematisch. Der Konstruktor für figure erwartet x und y (nehme an das sollen die Koordinaten sein). circle sieht so etwas nicht vor.
    Auch bietet figure keinen Standardkonstruktor, der x und y auf defaultwerte setzen würde. Ich wüsste nicht was da circle tun soll, insbesondere als Verwender der Klasse circle, wie ich die Position setzen kann.



  • /*
     *  Figure.cpp
     *  Aufgabe 3 Abgabe
     *
     *  Created by   on 24.03.10.
     *  Copyright 2010 __MyCompanyName__. All rights reserved.
     *
     */
    
    #include "Figure.h"
    #include <iostream>
    using namespace std; 
    
    figure::figure(double k,double m)//Konstruktor Basis Klasse
    {
    	x=k;
    	y=m;
    }
    
    figure::~figure()//Destruktor Basisklasse
    {
    	cout << "\nDestroyed";
    
    }
    
    //***************************************************\\
    
    circle::circle(double rad)
    
    {
    
    }
    
    void circle::print()
    {
    
    	cout << "\nArea is :" << 3,14159265*(r*r);
    
    }
    

    Dies ist die komplette cpp der Klassen



  • Ich weiß echt nicht was ich falsch mache , bzw wie ich es richtig mache !



  • Bacid90210 schrieb:

    Ich weiß echt nicht was ich falsch mache , bzw wie ich es richtig mache !

    Durch Nachdenken!

    circle::circle(double rad):figure(double k,double v)
    {}
    

    Ist "double k" ein Wert? Nein! 0 wäre ein Wert. Oder 1.789. Und ein Konstruktor - auch zur Basisinitialisierung - erwartet WERTE!



  • Ja diese bekommt er doch auch sobald er aufgerufen wird ..
    meinetwegen ...

    circle c1(0.0,0.0,5.0);
    

    oder nicht ..!?!



  • Wenn du das willst muss deine Klasse wie folgt aussehen:

    class circle : public figure
    {
        private:
        double r ;
    
        public:
        circle(double rad, double x, double y);
        ~circle();
        void print();
    };
    

    und deine Konstruktor-Definition wie folgt:

    circle::circle(double rad, double x, double y) : figure( x, y )
    {}
    


  • Ok dank dir jetz funktioniert es ...aber wiso genau muss ich hinter bei der Definition des Konstruktors diesen teil hier dazu schreiben ...bzw was macht der Compiler damit bzw schliesst er daraus :

    circle::circle(double rad, double x, double y) : ---> figure( x, y ) <----

    Das der x und y wert aus der Basisklasse stammt ?



  • Bacid90210 schrieb:

    Das der x und y wert aus der Basisklasse stammt ?

    Stichwort "Basisinitialisierung".
    Wenn du nichts hinschreibst, würde der Defualtkonstruktor verwendet, um den Basisklassenanteil von circle zu initialisieren. Da dies nicht immer geht oder der beste Weg ist (wie hier, wo du auch einen circle mit x und y instantiieren willst) kannst du einen anderen Konstruktor angeben, mit dem dann der Basisklassenanteil initialisiert wird.

    Lies dazu einfach in deinem Buch/Kurs/... das entsprechende Kapitel, sollte (hoffentlich) genügend Infos dazu geben.


Anmelden zum Antworten