2016-09-17 11 views
0

Es ist mein Code:Fehler Erbe kein Zugriff auf ein Verfahren C++

Fenetre *fen; 
fen = new Fenetre(h, l); 
tab_Ouverture[i]= *fen; 


air_facade - tab_Ouverture[i].get_air(); 


Error: error: ‘class Ouverture’ has no member named ‘get_air’ 

Thinks wissen: Fenetre ist Kind der Klasse Rectangle. Rechteck hat die Methode

get_air(); 

Fenetre ist Kind der Klasse Ouverture zu.

Es ist mein .h für Klasse Rechteck, Ouverture und Fenetre:

#ifndef DEF_RECTANGLE 
#define DEF_RECTANGLE 

class Rectangle { 

protected: 
float hauteur; 
float largeur; 

public: 

Rectangle(); 

Rectangle(float h, float l); 
float get_air(); 

}; 

#endif 

#ifndef DEF_OUVERTURE 
#define DEF_OUVERTURE 

    class Ouverture 
    { 

    }; 

    #endif 




#include "rectangle.h" 
#include "ouverture.h" 
#ifndef DEF_FENETRE 
#define DEF_FENETRE 

class Fenetre:public Rectangle, public Ouverture 
{ 
public: 

Fenetre(); 

Fenetre(float h, float l); 

}; 

#endif 

Definition von Ouverture und Fenetre:

Ouverture *tab_Ouverture; 
    tab_Ouverture = new Ouverture[5]; 


    Fenetre *fen; 
    fen = new Fenetre(h, l); 

Wenn ii verstehen, Fenetre keinen Zugriff auf get_air haben () Methode Ursache Fenetre wird zu einem Ouverture Objet zurückverwandelt, und mein Ouverture-Objekt ist kein Kind von Rectangle? Wie kann ich dieses Problem lösen, ohne eine Vererbung zwischen Rectangle und Ouverture zu machen?

Thks !!!

+0

Bitte bearbeiten Sie Ihren Beitrag mit den Deklarationen von 'Rectangle, Fenetre' und' Ouverture'. –

+0

Bitte geben Sie eine [mcve] an. – Barry

+0

Gibt es einen besonderen Grund, dass Sie diese Fenetre-Objekte als Ouverture-Objekte speichern? Wenn Sie nur eine Rechteckfunktion verwenden, warum werden sie nicht als Rechtecke gespeichert? Aber wenn Sie Methoden beider Klassen verwenden würden, warum sind sie dann nicht immer Fenetre-Objekte? –

Antwort

1

Ouverture hat keine Methode get_air().

get_air() ist ein Zugriff nur für Rechteck und Fenetre Klassen (seit Fenetre auch ein Rechteck)

Werfen Sie Ihre Zeiger auf Fenetre Klasse, als es funktionieren wird.

+0

Wie kann ich den Cast bitte? – valt

+0

Sie kann folgendermaßen aussehen: ((Fenetre *) & tab_Ouverture [i]) -> get_air(); aber Sie müssen überlegen, ob es nicht besser wäre, den Typ Ihres Arrays zu ändern ... –

+0

Cast Arbeit aber die Methode zurück 0:/ – valt

0

Sie haben zwei Probleme: Erstens, wenn Sie

tab_Ouverture[i]= *fen; 

Sie Scheibe Ihre Fenetre Objekt schreiben. Nur das Basisobjekt Ouverture wird tab_Ouverture zugewiesen und der Rest wird verworfen. Wenn Sie möchten, dass tab_Ouverture verschiedene Arten von Objekten enthält, muss es (intelligente) Zeiger enthalten.

So braucht Ihr Code etwas wie folgt aussehen:

std::vector<std::unique_ptr<Ourveture>> tab_Ouverture; // Vector of pointers 

    auto fen = std::make_unique<Fenetre>(h, l); // Create a new Fenetre 

    tab_Ouverture.push_back(std::move(fen));  // Move it into vector. fen is now gone. 

    ... 
    air_facade = tab_Ouverture[i]->get_air(); 

Sie werden feststellen, ich einen Vektor verwendet haben, anstatt eine einfache new'ed Array und std :: unique_ptr. Der Vorteil davon ist, dass es viel schwieriger Speicher zu verlieren, nicht Destruktoren aufrufen.

Das einzige Problem ist, dass diese noch nicht :-) Ihr zweites Problem umgehen, ist, dass tab_Ouverture[i] statischen Typen „(smart) Zeiger auf Ouverture“ hat, und Ouverture hat keine get_air Methode. Es gibt zwei Lösungen für dieses:

  1. Cast der Zeiger Sie von tab_Ouverture[i] in einen Fenetre Zeiger zu bekommen. Geben Sie Ouverture eine (reine) virtuelle get_air Funktion ein.

Die Besetzung würde wie folgt aussehen:

auto pFen = dynamic_cast<Fenetre*>(&*tab_Ouverture[i]); 
    if (pFen) 
    { 
     air_facade = pFen->get_air(); 
    } 

Die ziemlich seltsam &* der einfachste Weg ist es, einen Smart-Pointer in eine reale Adresse zu wenden. * gibt einen Verweis auf das Objekt zurück, auf das sich der intelligente Zeiger bezieht; & erhält seine Adresse. (Es gibt Möglichkeiten, dies kann zu brechen, aber Sie müssen sich nicht um sie kümmern.) Ich empfehle die virtuelle in Ouverture.

+0

Oh mein Gott, ich habe nicht den Lvl, dies zu tun ... = O Ich werde versuchen .. Thks – valt

+0

Nah. * Anfänger * sollten std :: unique_ptr, make_unique und Vektoren verwenden. Roh neu ist nur für erfahrene Experten (die es wie die Pest vermeiden). –