c ++ - 在函数中创建类实例并在以后使用它

时间:2012-11-24 11:42:01

标签: c++ oop class static

我可以这样做:

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();
    }
}

2 个答案:

答案 0 :(得分:3)

不,这不是一个很好的方法,因为你传递了Toggle副本

  • GetAutoUpdatedToggle会返回刚刚推送到Toggle的{​​{1}}的副本。这本身并不是一件坏事,但是调用者对返回的切换进行的任何操作都不会反映在你推到vector
  • 的那个上。
  • vector循环遍历for的元素,创建一个在循环体内使用的副本。除非vector本身具有类似指针的语义,否则Toggle操作不会反映在Update()内的Toggle个对象上。

要解决此问题,请让vector引用返回到刚刚推送到GetAutoUpdatedToggle的{​​{1}}对象,然后使用{{1}对象迭代存储的切换。这可以让你操作实际的对象,而不是它们的副本。

答案 1 :(得分: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标识的对象。