C++ c++;-在函数中创建类实例并在以后使用
我可以这样做吗:C++ c++;-在函数中创建类实例并在以后使用,c++,oop,class,static,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; } 这
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;
}
这样做好吗
更新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();
}
}
静态切换*GetAutoUpdatedToggle(DWORD键,bool initialState=false)
{
Toggle*pToggle=新切换(键,初始状态);
m_自动更新切换。向后推(ptogle);
返回点;
}
void Toggle::updatealFromFactory()
{
对于(std::vector::iterator it=m_autoUpdateToggles.begin();itUpdate();
}
}
静态函数返回切换的副本。推回
也将创建切换的副本。因此,您返回的切换
不在自动更新切换
中,以后无法更新
Toggle myToggle = GetAutoUpdatedToggle(key);
/* ... */
Toggle alternativToggle = myToggle;
// alternativToggle == myToggle is true
Toggle::UpdateAllFromFactory();
// alternativToggle == myToggle is still true
还请注意,Toggle::updatealFromFactory()的当前实现如果不使用迭代器,代码>将使用切换的副本
您必须为切换
对象提供一个句柄。这可以是一个简单的指针或任何其他对象,在复制时不会丢失特定的切换的标识。不,这不是一个好方法,因为您会传递切换的副本:
GetAutoUpdatedToggle
返回刚刚推入向量的切换的副本。这本身并不是一件错误的事情,但是调用方对返回的切换所做的任何操作都不会反映在您推到向量上的操作上
for
循环遍历向量的元素,创建一个副本供循环体内部使用。除非切换
本身具有类似指针的语义,否则更新()
操作不会反映在向量
中的切换
对象上
要解决此问题,请使GetAutoUpdatedToggle
返回对它刚刚推送到向量上的Toggle
对象的引用,并使用vector::iterator
对象迭代存储的切换。这将允许您对实际对象进行操作,而不是对其副本进行操作。因此我应该在该函数中创建指向类的指针。在向量中我应该保留指针吗?我总是对此感到困惑。我用c编写了很多程序,如果你使用c++11,你可以使用std::shared\u ptr
。从vector获取最后一个推送元素的ESET方法是什么?@Hooch这可能是返回最后一个推送元素的最简单方法:return*autoUpdateToggles.rbegin()代码>我这样修复了它:请参阅我的question@Hooch是的,你也可以使用指针。然而,这让您负责内存管理:“new”操作符调用必须用“delete”调用进行反击,因此您需要在代码中的某个地方注意这一点,以避免内存泄漏。另一种方法是使用unique_ptr模板而不是指针。您可以将索引返回到std::vector而不是Toggle实例。
Toggle myToggle = GetAutoUpdatedToggle(key);
/* ... */
Toggle alternativToggle = myToggle;
// alternativToggle == myToggle is true
Toggle::UpdateAllFromFactory();
// alternativToggle == myToggle is still true