私は幸せな人の配列を持っています。 それぞれの幸せな人物には、そのhappyiness属性を更新するために使用されるupdateHappiness()という仮想関数があります。 各人は自分のことが好きです。より多くのパラメータで仮想関数を上書きする
雨の好きな人は、雨の音が聞こえて幸せな人で、幸福度を高めます。彼らは幸せな人のクラスから継承します。
結果として、この投稿のようにupdateHappiness(bool isRaining)でupdateHappiness()関数をオーバーロードすることで、幸せを更新しながら雨が降っているかどうかを知る必要があります:overload virtual function with different parameters in c++しかし、私たちはすべての人に同じ機能を呼び出すことでそれらをすべて更新したいと考えています。
このポストのように、パラメータをPersonクラスの内部に格納してクラスコンストラクタに渡すことができます:Override number of parameters of pure virtual functionsしかし、rainは一定の状態ではなく、関数updateRainState(bool isRaining)を呼び出す必要があります。前と同じ問題が発生します。
雨が気にならないにもかかわらず、すべての人にパラメータbool isRainingを渡すことができましたが、雨のような人や昼間のような人々、彼らの友達は幸せです...それは多くの無駄なパラメータを追加し、それは無駄に思われます。
最後に、私が考えることができる最良の解決策は、パラメータとして渡さずに雨の状態を取得するために天気のクラスに静的関数を持たせることですが、グローバル変数のように見えます。悪い!
この問題を解決するにはどうすればよいですか?代わりに、イベントコールバックを使用する - あなたは完全に異なるアプローチを取って検討すべきである
class HappyPerson
{
public:
HappyPerson(): m_happinness(0) {}
virtual void updateHappinness() { m_happinness++; }
protected:
int m_happinness;
};
class Weather
{
public:
static int isRaining() { return raining; }
private:
static bool raining;
};
bool Weather::raining(0);
class RainLover : public HappyPerson
{
public:
RainLover() : HappyPerson() {}
void updateHappinness() { m_happinness++; if (Weather::isRaining()) m_happinness++; }
};
int main()
{
std::vector<HappyPerson*> happyPeople;
happyPeople.push_back(new RainLover);
// ... add many other persons
std::vector<HappyPerson*>::iterator it;
for (it = happyPeople.begin(); it != happyPeople.end(); it++)
{
(*it)->updateHappinness();
}
}
確かに、これらの人々は、生のポインタとしてコンテナに格納されているとは限りません。代わりに 'std :: vector>'を使用してください。 –
ArchbishopOfBanterbury
あなたのアプリケーションのコンテキストでは、「HappyPerson」が天気を知っていることは意味がありますか?天気に興味のある人は、Weather通知に変更があったときに通知を受信して、興味のある天気の天気を照会することができます。 –
これは単なる例ですが、彼らはまだ心配していません。多形性を有効にするためにいくつかのポインタを使用しなければならなかった – MaxV37