2016-04-09 3 views
-1

Ich habe Klasse Presenter welche erbt von ModelListener.Dereferenzierung Objekt der Vorwärts deklarierten Klasse

class Model; 

class ModelListener 
{ 
public: 
    ModelListener() : model(0) {} 

    virtual ~ModelListener() {} 

    void bind(Model* m) { model = m; } 

protected: 
    Model * model; 
}; 

Ich habe auch eine Instanz . Wenn ich presenter->model->PrintName() anrufe, kompiliert es natürlich nicht, da model geschützt ist zu presenter. Aber wenn ich dann weiter Model * model wie diese für die öffentliche ändern

class Model; 

class ModelListener 
{ 
public: 
    ModelListener() : model(0) {} 

    virtual ~ModelListener() {} 

    void bind(Model* m) { model = m; } 

//protected: 
    Model * model; 
}; 

Ich kapier:

MyView.cpp: error: invalid use of incomplete type 'class Model' presenter->model->PrintName(); ModelListener.hpp: error: forward declaration of 'class Model'.

Warum ich diese Fehlermeldung erhalten, wenn public gehen und nicht, wenn protected?

Antwort

0

Da der Compiler zuerst überprüft, ob das Mitglied zugänglich ist, bevor tatsächlich versucht wird, darauf zuzugreifen.

Im ersten Fall ist Mitglied geschützt, so dass der Compiler einen Fehler meldet, bevor er versucht, auf seinen Inhalt zuzugreifen.

Im zweiten Fall ist das Mitglied öffentlich, also zugänglich; Der Compiler versucht dann, darauf zuzugreifen, und scheitert, da er unvollständig definiert ist.

Fügen Sie in MyView.cpp die Kopfzeile hinzu, in der die Model Klasse definiert ist (z. B. #include "Model.hpp"), um diesen Fehler zu beheben.