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 的副本。

您必须提供 对象的句柄ToggleToggle这可以是一个简单的指针或任何其他在复制时不会丢失特定标识的对象。

于 2012-11-24T11:46:20.980 回答