我可以这样做:
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();
}
}
答案 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
标识的对象。