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