0

質問があります。スーパークラスに静的メンバーがある場合、このスーパークラスのすべてのサブクラスにアクセスを許可し、静的メンバーを使用するにはどうすればよいですか。

例えば

/*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);
};

与えられたエラーは次のとおりです。「宣言されていない識別子「データベース」の使用」

4

3 に答える 3

3

staticクラス宣言からそのメンバーを定義します。

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

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

クラス定義内の静的データ メンバーの宣言は定義ではありません ... 静的データ メンバーの定義は、メンバーのクラス定義を囲む名前空間スコープに表示されます。

protected派生クラスからアクセスできるようにする方法は問題ありません。

于 2013-10-09T08:42:45.087 に答える
2

static Commands member database の定義が欠落していることを除いて、コードは問題ないように見えます。database外部commandsクラスを定義する必要があります

Container Commands::database;

§ 9.4.2 静的メンバー

静的メンバーは、通常のクラス メンバー アクセス規則 (条項 11) に従います。クラス メンバーの宣言で使用される場合、静的指定子は、クラス定義のメンバー仕様内に現れるメンバー宣言でのみ使用されます。

database基本クラスの保護されたメンバーであるため、Commands派生クラスは、演算子またはオブジェクトからの演算子Addによってそれにアクセスできる必要があります。::.

于 2013-10-09T08:52:41.917 に答える
0

staticメンバーはすべてのオブジェクト間で共有されるため。Commands::database大丈夫なはず。

于 2013-10-09T09:25:41.470 に答える