【问题标题】:c++ - Creating class instance in function and using it laterc++ - 在函数中创建类实例并稍后使用
【发布时间】:2012-11-24 11:42:00
【问题描述】:

我可以这样做吗:

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

【问题讨论】:

  • 您可以将索引返回到 std::vector 而不是 Toggle 实例。

标签: c++ oop class static


【解决方案1】:

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

  • GetAutoUpdatedToggle 返回它刚刚推入vectorToggle副本。这本身并不是一件错误的事情,但是调用者可能对返回的切换进行的任何操作都不会反映在您推送到 vector 上的操作上
  • for 循环遍历vector 的元素,创建一个副本以在循环主体内使用。除非Toggle 本身具有类似指针的语义,否则Update() 操作不会反映在vector 内的Toggle 对象上。

要解决此问题,请让 GetAutoUpdatedToggle 返回一个 reference 到它刚刚推送到 vector 上的 Toggle 对象,并使用 vector&lt;Toggle&gt;::iterator 对象遍历存储的切换。这将允许您对实际对象进行操作,而不是对其副本进行操作。

【讨论】:

  • 好的。从vector中获取最后一个推送元素的esiet方法是什么?
  • @Hooch 这可能是返回您推回的最后一个元素的最简单方法:return *autoUpdateToggles.rbegin();
  • 我这样修复它:请参阅我的问题中的更新 1
  • @Hooch 是的,你也可以使用指针。但是,这会让您负责内存管理:“new”操作员调用必须与“delete”调用相抵消,因此您需要在代码中的某个地方处理它以避免内存泄漏。另一种方法是使用 unique_ptr 模板而不是指针。
【解决方案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 标识的对象。

【讨论】:

  • 所以我应该在该函数中创建指向类的指针。在向量中我应该保留指针?我总是对此感到困惑。我在 c# 中编写了很多程序
  • 如果你使用 C++11,你可以使用std::shared_ptr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多