3

私はこれを行うことができます:

static Toggle GetAutoUpdatedToggle(DWORD key, bool initialState = false)
{
    Toggle tempToggle(key, initialState);
    autoUpdateToggles.push_back(tempToggle); //This is static member - std::vector<Toggle>
    return tempToggle;
}

また、後で次のように使用しています。

void Toggle::UpdateAllFromFactory() //This is static function
{
    for each (Toggle toggle in autoUpdateToggles)
    {
        toggle.Update();
    }
}

これは良い方法ですか?


更新 1 - あなたの提案の後:

static Toggle* GetAutoUpdatedToggle(DWORD key, bool initialState = false)
{
    Toggle *pToggle = new Toggle(key, initialState);
    m_autoUpdateToggles.push_back(pToggle);
    return pToggle;
}

void Toggle::UpdateAllFromFactory()
{
    for (std::vector<Toggle*>::iterator it = m_autoUpdateToggles.begin(); it < m_autoUpdateToggles.end(); it++)
    {
        (*it)->Update();
    }
}
4

2 に答える 2

3

いいえ、これは良い方法ではありませんToggle

  • GetAutoUpdatedToggleにプッシュしたばかりの のコピーを返します。それ自体は間違ったことではありませんが、返されたトグルに対して発信者が行った操作は、あなたがプッシュしたトグルには反映されません。Togglevectorvector
  • ループはのfor要素を通過しvector、ループ本体内で使用するコピーを作成します。Toggle自体がポインターのようなセマンティックを持っていない限り、アクションは内のオブジェクトUpdate()に反映されません。Togglevector

この問題を解決するには、にプッシュしたばかりのオブジェクトへの参照GetAutoUpdatedToggle返すようにし、オブジェクトを使用して保存されたトグルを反復処理します。これにより、コピーではなく実際のオブジェクトを操作できます。Togglevectorvector<Toggle>::iterator

于 2012-11-24T11:48:37.723 に答える
2

静的関数はのコピーを返しますToggle.push_backトグルのコピーも作成します。したがって、Toggleあなたが返すものはになく、autoUpdateToggles後で更新することはできません。

Toggle myToggle = GetAutoUpdatedToggle(key);
/* ... */

Toggle alternativToggle = myToggle;
// alternativToggle == myToggle is true
Toggle::UpdateAllFromFactory();

// alternativToggle == myToggle is still true

Toggle::UpdateAllFromFactory();また、代わりにイテレータを使用しなかった場合、現在の実装ではTogglesのコピーが使用されていることに注意してください。

オブジェクトへのハンドル を提供する必要がありToggleます。Toggleこれは、単純なポインタ、またはコピー時に特定のIDを失うことのないその他のオブジェクトにすることができます。

于 2012-11-24T11:46:20.980 に答える