2013-10-09 94 views
0

我有一個問題。如果我在超類中有一個靜態成員,那麼如何讓這個超類的所有子類都可以訪問並使用靜態成員。通過C++中的子類訪問超類的受保護靜態成員

E.g.

/*Superclass*/ 
class Commands { 
    protected: 
      static Container database; 
}; 

/*Sub class*/ 
class Add: public Commands { 
    public: 
      void add_floating_entry(std::string task_description); 
}; 

/*This gives me an error. add_floating_task is a method of the Container Class*/ 
void Add::add_floating_entry(string task_description) 
{ 
    database.add_floating_task(task_description); 
} 

我可以知道這裏有什麼問題嗎?提前致謝!

編輯:

容器類是如下

class Container { 
private: 
    vector<Task_Info*> calendar[13][32]; 
    vector<Task_Info*> task_list; 
public: 
    void add_floating_task(std::string task_description); 
}; 

給出的錯誤是:數據庫‘

+5

「這給我一個錯誤。」 - 這沒有幫助,沒有一個通用的C++錯誤。 –

+1

請顯示'Container'的定義和錯誤信息。 – jrok

回答

3

定義「未聲明的標識符的使用’該static構件出來的類聲明的:

class Commands { 
protected: 
    static Container database; // <-- It's just a declration 
}; 

Container Commands::database; // <-- You should make a definition 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

靜態數據成員在其類定義中的聲明不是 定義...靜態數據成員的定義應該在包含成員的類定義的命名空間範圍中出現 。

您可以通過自己的方式將其設置爲protected以使派生類可以訪問它。

+0

感謝您的幫助。從Java切換到C++我仍然很不舒服。 – boxme

1

你的代碼看起來不錯,除了缺少靜態命令成員數據庫的定義。 您需要定義databasecommands

Container Commands::database; 

§9.4.2靜態成員

靜態成員服從常見的類成員訪問規則(第11條)。在類成員的聲明中使用時,靜態說明符只應用於類定義的成員規範中出現的成員聲明中。

作爲database是基類Commands,派生類Add的受保護的構件應該能夠通過操作者::或從對象.操作來訪問它。

0

由於static成員在所有對象之間共享。 Commands::database應該沒問題。