2016-04-09 12 views
-1

ModelListenerを継承するクラスPresenterがあります。前方宣言されたクラスの参照解除オブジェクト

class Model; 

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

    virtual ~ModelListener() {} 

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

protected: 
    Model * model; 
}; 

また、私はインスタンスPresenter presenterを持っています。私がpresenter->model->PrintName()と呼ぶとき、modelpresenterに保護されているので、それはもちろんコンパイルされません。しかし、私はその後、さらにこの

class Model; 

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

    virtual ~ModelListener() {} 

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

//protected: 
    Model * model; 
}; 

のように国民にModel * modelを変更した場合、私は入手できます:

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

publicなくprotectedを行くとき、私はこのエラーが出るのはなぜ?

答えて

0

コンパイラは、実際にアクセスしようとする前にメンバーがアクセス可能かどうかをまずチェックするため、

最初のケースでは、メンバーは保護されているためアクセスできないため、コンパイラはそのコンテンツにアクセスしようとする前にエラーを報告します。

2番目のケースでは、メンバーはパブリックなのでアクセス可能です。コンパイラはそれにアクセスしようとし、不完全に定義されているので失敗します。

このエラーを修正するために、Modelクラスが定義されているヘッダー(例:#include "Model.hpp")をMyView.cppに含めます。

関連する問題