[C/C++] Kleines Problem mit virtueller Funktion

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von c2000, 30. Dezember 2008 .

  1. 30. Dezember 2008
    Kleines Problem mit virtueller Funktion

    Hi, habe folgenden Programmteil:

    class teilchen : protected coordinates
    {
    private:

    bool gezaehlt; // Wird nicht erneut gezählt
    bool alive; // Teilchen lebt oder tod
    float winkel; // Aktueller Winkel
    int ablenkungen; // Anzahl der Ablenkungen
    float streulaenge; // Laenge fuer eine Ablenkung
    float ablenkungswinkel; // Ablenkungswinkel
    public:
    teilchen(float x,float y, float xmax, float ymax, int ablenkungen, float ablenkungswinkel)
    {
    this->x = x;
    this->y = y;
    this->xmax = xmax;
    this->ymax = ymax;
    this->ablenkungen = ablenkungen;
    this->ablenkungswinkel = ablenkungswinkel;
    gezaehlt = false;
    alive = true;
    winkel = 0;
    streulaenge = xmax/ablenkungen + 0.01 * xmax;
    }
    ~teilchen() {}

    virtual void fliegen();

    float get_x() { return x; }
    float get_y() { return y; }
    int get_ablenkungen() { return ablenkungen; }
    bool get_alive() { return alive; }
    void kill() { alive = false; }
    void check()
    {
    if((x<0) || (x>xmax) || (y<0) || (y>ymax))
    this->alive = false;
    }
    bool get_gezaehlt() { return gezaehlt; }
    void set_gezaehlt() { gezaehlt = true; }
    };



    class ateilchen : public teilchen
    {
    private:
    void fliegen()
    {
    float faktor=0.0; // Ablenkungsfaktor
    for (int k = 1; k <= 12; k++) // Schleife fuer die Zufallsberechnung des Ablenkungsfaktors
    {
    faktor = faktor + random(1000)/1000.0;
    }
    winkel = winkel + ablenkungswinkel * (faktor-6); // Berechnung des aktuellen Ablenkungswinkels
    x = x + streulaenge * cos(winkel); // Berechnung der aktuellen Position nach Streuung
    y = y + streulaenge * sin(winkel); // Berechnung der aktuellen Position nach Streuung
    }
    //~ateilchen() {}
    };

    Der Fehler:
    Der Compiler bringt mir das der Zugriff auf die Klasse Teilchen nicht möglich ist.
    Zugriff auf 'teilchen::ablenkungswinkel' nicht möglich
    Das selbe mit winkel und streulaenge in der Klasse ateilchen.


    Weiss da jemand abhilfe?
     
  2. 30. Dezember 2008
    AW: Kleines Problem mit virtueller Funktion

    1. Verwende bitte demnächst den CODE-Tag, um Quelltext formatiert darzustellen
    2. Du hast ablenkungswinkel als private deklariert. Dann kann - soweit ich informiert bin - auch nur die eigene Klasse, und keine Ableitungen darauf zugreifen

    Eine Ableitung kann nicht auf private Felder ihrer direkten Basis zugreifen
     
  3. 30. Dezember 2008
    AW: Kleines Problem mit virtueller Funktion

    ja richtig. änders einfach auf protected um, dann ists nach aussen hin private, aber abgeleitete klassen können drauf zugreifen wie wenns als public deklariert worden wäre.
     
  4. 30. Dezember 2008
    AW: Kleines Problem mit virtueller Funktion

    Das mit dem Protected scheint zu gehen, compilieren klappt jetzt.
    Aber ich dachte wenn ich eine virtuelle Funktion habe, kann diese auch auf den private Teil von der Basisklasse zugreifen?

    Wie gesagt, compilieren geht. Jetzt bringt er mir aber ein fehler wenn er das Objekt erzeugen will.

    "Linker Fehler" Unresolved external '{803}...' referenced from c:\mein speicherverzeichnis\

    Was soll das schon wieder?



    Ach, und wie war nochmal der Befehl für den "Code-Tag"?
     
  5. 30. Dezember 2008
    AW: Kleines Problem mit virtueller Funktion

    Falsch gedacht
    wenn eine Funktion virtuell ist, dann heißt das nur, dass sie unbedingt implementiert werden soll.


    [ c o d e ] und [ / c o d e ]
     
  6. 30. Dezember 2008
    AW: Kleines Problem mit virtueller Funktion

    bez.: ""Linker Fehler" Unresolved external '{803}...' referenced from c:\mein speicherverzeichnis\"
    du musst die funktion "main" definieren ^^

    aja und konstruktoren werden nicht vererbt, deshalb solltest du den konstruktor in der abgeleiteten klasse ebenfalls definieren.

    ich war mal so frei:
    Code:
    #include <math.h>
    #include <iostream>
    
    using namespace std;
    
    int random(int r)
    {
     return 4; //100% random! 
    }
    
    class cords
    {
     protected:
     float x;
     float y;
     float xmax;
     float ymax; 
    };
    
    class teilchen : protected cords
    {
     protected:
     bool gezaehlt; // Wird nicht erneut gezählt
     bool alive; // Teilchen lebt oder tod
     float winkel; // Aktueller Winkel
     int ablenkungen; // Anzahl der Ablenkungen
     float streulaenge; // Laenge fuer eine Ablenkung
     float ablenkungswinkel; // Ablenkungswinkel
     virtual void fliegen();
    
     public: 
     ~teilchen() {}
    
     float get_x() { return x; }
     float get_y() { return y; }
     int get_ablenkungen() { return ablenkungen; }
     bool get_alive() { return alive; }
     void kill() { alive = false; }
    
     void check()
     {
     if((x<0) || (x>xmax) || (y<0) || (y>ymax))
     this->alive = false;
     }
    
     bool get_gezaehlt() { return gezaehlt; }
     void set_gezaehlt() { gezaehlt = true; }
    };
    
    
    
    class ateilchen : public teilchen
    {
     public:
     ateilchen(float x,float y, float xmax, float ymax, int ablenkungen, float ablenkungswinkel)
     {
     this->x = x;
     this->y = y;
     this->xmax = xmax;
     this->ymax = ymax;
     this->ablenkungen = ablenkungen;
     this->ablenkungswinkel = ablenkungswinkel;
     gezaehlt = false;
     alive = true;
     winkel = 0;
     streulaenge = xmax/ablenkungen + 0.01 * xmax;
     }
     
     protected:
     void fliegen()
     {
     float faktor=0.0; // Ablenkungsfaktor
     for (int k = 1; k <= 12; k++) // Schleife fuer die Zufallsberechnung des Ablenkungsfaktors
     faktor = faktor + random(1000)/1000.0;
    
     winkel = winkel + ablenkungswinkel * (faktor-6); // Berechnung des aktuellen Ablenkungswinkels
     x = x + streulaenge * cos(winkel); // Berechnung der aktuellen Position nach Streuung
     y = y + streulaenge * sin(winkel); // Berechnung der aktuellen Position nach Streuung
     }
     //~ateilchen() {}
    };
    
    int main(void) {}
    kompiliert und kein fehler

    aja und noch n kleiner hinweis: klassen schreibt man groß und man benutzt tabs!
     
  7. 31. Dezember 2008
    AW: Kleines Problem mit virtueller Funktion

    Habe das ganze nun so:

    PHP:
    class  teilchen  : protected  coordinates
    {
        protected:
            
    bool gezaehlt // Wird nicht erneut gezählt
            
    bool alive // Teilchen lebt oder tod
            
    float winkel // Aktueller Winkel
            
    int ablenkungen // Anzahl der Ablenkungen
            
    float streulaenge // Laenge fuer eine Ablenkung
            
    float ablenkungswinkel // Ablenkungswinkel
            
    virtual void fliegen ();

        public:        
            ~
    teilchen () {}

            
    float get_x () { return  x ; }
            
    float get_y () { return  y ; }
            
    int get_ablenkungen () { return  ablenkungen ; }
            
    bool get_alive () { return  alive ; }
            
    void kill () {  alive  false ; }

            
    void check ()
            {
                if((
    x < 0 ) || ( x > xmax ) || ( y < 0 ) || ( y > ymax ))
                    
    this -> alive  false ;
            }

            
    bool get_gezaehlt () { return  gezaehlt ; }
            
    void set_gezaehlt () {  gezaehlt  true ; }
    };



    class 
    ateilchen  : public  teilchen
    {
        public:
            
    ateilchen ( float x , float y float xmax float ymax int ablenkungen float ablenkungswinkel )
            {
                
    this -> x ;
                
    this -> y ;
                
    this -> xmax  xmax ;
                
    this -> ymax  ymax ;
                
    this -> ablenkungen  ablenkungen ;
                
    this -> ablenkungswinkel  ablenkungswinkel ;
                
    gezaehlt  false ;
                
    alive  true ;
                
    winkel  0 ;
                
    streulaenge  xmax / ablenkungen  0.01  xmax ;
            }
            

            
    void fliegen ()
            {
                
    float faktor = 0.0 // Ablenkungsfaktor
                
    for ( int k  1 <=  12 k ++)  // Schleife fuer die Zufallsberechnung des Ablenkungsfaktors
                    
    faktor  faktor  random ( 1000 )/ 1000.0 ;

                
    winkel  winkel  ablenkungswinkel  * ( faktor - 6 );  // Berechnung des aktuellen Ablenkungswinkels
                
    streulaenge  cos ( winkel );  // Berechnung der aktuellen Position nach Streuung
                
    streulaenge  sin ( winkel );  // Berechnung der aktuellen Position nach Streuung
            
    }
        ~
    ateilchen () {}
    };

    Die restlichen Programmteile habe ich nicht hier aufgeführt.

    Der Fehler besteht witerhin...


    Für was sind denn eigentlich diese "->" Pfeile? Verstehe ich auch noch nicht ganz.
     
  8. 31. Dezember 2008
    AW: Kleines Problem mit virtueller Funktion

    Code:
    class ateilchen : public teilchen
    {
     public:
     ateilchen(float x,float y, float xmax, float ymax, int ablenkungen, float ablenkungswinkel)
     {
     this->x = x;
     this->y = y;
     this->xmax = xmax;
     this->ymax = ymax;
     this->ablenkungen = ablenkungen;
     this->ablenkungswinkel = ablenkungswinkel;
     gezaehlt = false;
     alive = true;
     winkel = 0;
     streulaenge = xmax/ablenkungen + 0.01 * xmax;
     }
    Hier hast du ja ein Klasse ateilchen, die von teilchen abgeleitet ist. Darin ist eine Funktion public, die den selben Namen hat wie die Klasse und ist somit der Konstruktor (zumindest in diesem Fall). Der Konstruktor benötigte diverse Parameter:
    (float x,float y, float xmax, float ymax, int ablenkungen, float ablenkungswinkel)
    mit
    Code:
    this->x=x;
    wird der Eigenschaft x dieses Objektes der Wert x aus der Paramterliste zugewiesen.
    Es ist hier ein wenig unübersichtlich dargestellt, da die Parameter die selben Namen haben wie die Eigenschaften der Klasse. Ich würde vor jeden Parameter ein p Setzen, um es lesbarer zu machen:
    Code:
    ateilchen(float pX, pY, pXmax, pYmax, pAblenkungswinkel, int pAblenkungen)
    Der -> ist in diesem Falle ein Zugriffsoperator, mit dem du auf Eigenschaften der Klasse zugreifst.
    Mit
    Code:
    this->x
    greifst du also auf die Eigenschaft x dieser Klasse (die Klasse, in der solch ein Ausdruck aufgerufen wird) zu.

    Ich hoffe du hast verstanden, was ich hier versucht habe zu erklären :/

    Guten Rutsch und greez
     
  9. 2. Januar 2009
    AW: Kleines Problem mit virtueller Funktion

    Ja ok danke, denke habe es jetzt ein bisschen mehr verstanden ^^

    Aber Projekt kann ich immer noch nicht erzeugen, immer noch der selbe fehler....
    Wenn ich das Programm so umschreibe wie Murdoc bringt er mir in einer anderen Stelle im Programm ein fehler.
    Ich habe auch nicht alle Programmteile gepostet.
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.