【问题标题】:Can't Save structure content无法保存结构内容
【发布时间】:2012-12-13 15:32:18
【问题描述】:

我有下一个问题: 我创建了结构:

struct Series : vector<Candle>
{ 
 Security Sec;
 int LookFor;
 int TF;
 int Corrector;
 string ID;
 int line;
 Series(){};
 Series (int _lookfor);
 void Update();  
};

构造函数:

Series::Series (int _lookfor)
{
 LookFor=_lookfor;
 for (int i = 1; i<=LookFor; i++)
  {
    Candle cantype = Candle(i);
    push_back(cantype);
  }
}

所以,我们称这个构造函数为它用蜡烛值填充对象。 LookFor - 是向量系列中的许多蜡烛。 初始化后我想更新这个系列(如果有更多新蜡烛,我想删除最后一个并在矢量系列的开头插入新的)

void Series::Update()
{
if (size()==LookFor)
{
        if (newer(cantype,c1))
        {
          Candle cantype = Candle(1);
          Candle c1 = at(0);
          pop_back();
          emplace(begin(),cantype);
        }
}

我需要初始化这些系列的一个向量:

向量 vec; vec.push_back(系列(3));

构造函数完成了它的工作,一切都很好。 但后来我更新了它们:

for (size_t x =0; x<=size()-1;x++) vec[x].Update();

我有一个问题:它无法保存向量中的更改。在 Update 方法中一切都很好,它在自身中插入所需的蜡烛,但随后方法结束 - 向量的状态(vec 的每个元素)没有变化。在方法中我们看到了变化,但是在它的向量变成了类似构造函数之后,状态还是一样的。 请告诉我,我做错了什么?

【问题讨论】:

  • 不要从标准库设施派生。尤其不是来自容器。
  • 从 std 容器继承会产生未定义的结果。修复它(撰写而不是继承),如果它不能解决问题,请发布另一个问题。
  • @utnapistim “从标准容器继承会产生未定义的结果”——不,不会
  • 这很可能是您没有向我们展示的代码中的逻辑错误

标签: c++ vector struct


【解决方案1】:
  • 正如其他人已经提到的,不要从这些容器派生(可能会导致严重的错误,例如缺少 dtor 调用和内存泄漏,这些容器中不存在虚拟析构函数)。相反,如果您进行私有继承,请将向量添加为成员或保持原样。

  • 您可以对此类容器使用迭代器接口:

for(std::vector&lt;Series&gt;::iterator sIt = vec.begin();sIt != vec.end();++sIt) sIt-&gt;Update();

  • 对于您的任务,请考虑使用双端队列或列表作为循环缓冲区,而不是蜡烛的向量。它在插入时表现更好,因此允许您使用push_front() 而不是emplace()insert()。 或者,您可以在最后一个元素(应该是第一个元素)之后保存向量元素的索引,然后分配新的蜡烛,等等,您已经得到了一个密集的循环缓冲区。 有这样的循环缓冲区的实现,例如 boost 之一: http://www.boost.org/doc/libs/1_52_0/libs/circular_buffer/doc/circular_buffer.html

尽管存在逻辑问题,可能会阻止在某些状态下进行修改,但我看不出为什么您的代码根本不起作用,至少在我查看您发布的 sn-ps 时不会。

【讨论】:

  • 感谢您的帮助!真的,问题出在 cicle 中,我没有使用迭代器。现在我也在使用 std::deque 而不是从容器派生,只添加 std::deque 作为我的系列对象的成员!再次感谢您:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2017-01-06
  • 2015-11-25
  • 2020-02-09
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多