2016-04-09 46 views
-1

我有Presenter類,它繼承自ModelListener正向聲明類的解引用對象

class Model; 

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

    virtual ~ModelListener() {} 

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

protected: 
    Model * model; 
}; 

此外,我有一個實例Presenter presenter。當我致電presenter->model->PrintName()時,它當然不會編譯,因爲model受保護爲presenter。但是,如果我再進一步改變Model * model公衆這樣

class Model; 

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

    virtual ~ModelListener() {} 

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

//protected: 
    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

由於編譯器首先會在實際嘗試訪問成員之前檢查成員是否可訪問。

在第一種情況下,成員受到保護,因此無法訪問,則編譯器在嘗試訪問其內容之前報告錯誤。

在第二種情況下,成員是公開的,可以訪問;那麼編譯器會嘗試訪問它,並且因爲它沒有完全定義而失敗。

在MyView.cpp中包含定義Model類的標頭(例如#include "Model.hpp")來解決此錯誤。