【问题标题】:Copying C++ objects from an iterator从迭代器复制 C++ 对象
【发布时间】:2016-03-08 18:55:50
【问题描述】:

我正在尝试构建一个对象数组,在集合上使用迭代器来获取值。

目前的代码是:

Object array[n]; //n is defined higher up the program
int index = 0;
for (iterator i = container.begin(), ie = container.end(); i != ie;++i) {
  Object f = *i;
  array[index] = f;
  index++;
}

我已经抽象了一些东西,对象和容器是来自第三方库的类。

这段代码可以工作,但 Object 的赋值运算符已被删除,并且它的复制构造函数是私有的。

进一步点:

虽然我当然可以轻松构建 Object*[] 类型的东西,但它与代码中稍后的库调用不兼容。

容器没有 'to array' 方法或类似的方法。

【问题讨论】:

  • 如果Object 不可复制,那么写Object 的人特别不希望你这样做。很可能副本无论如何都无法正常工作。因此,您要么必须停止尝试这样做(也许保留一个 Object* 数组,并找到一种方法来避免无法使用它的库调用),否则您必须将它们声明为错误并重新编写Object.
  • 对象的赋值运算符已被删除,它的复制构造函数是私有的 似乎有人不想让你复制这个Object ...
  • Object 有移动构造函数和/或移动赋值运算符吗?

标签: c++ arrays oop iterator


【解决方案1】:

对于通过搜索您的标题找到此主题的其他人:如果不可复制约束不适用,您将完全按照您尝试的方式从迭代器中复制。

回答您的问题: 如果您在第三方 C++ 库中找到名为“Object”的类,则应立即将该第三方库扔进垃圾桶,并找到由懂 C++ 的人编写的替代方案,而不是由懂 C++ 的人编写的替代方案。他们非常喜欢 Java(或另一种具有公共基础对象的语言),因此他们决定尝试用一种没有意义的语言来模仿它的行为。我不是想废话,但这是一个严重的危险信号。

但是,如前所述,如果 object 不可复制构造,那么在 Object 的实现中很可能有一些东西,类的作者知道,而你不知道,这会禁止复制。试图解决它是在寻找错误。

我的第一个想法是联系库的作者并询问他们为什么认为该对象不可复制以及可以针对您的特定用途做些什么。

如果您只是想将 Objects 的实例从一个数组移动到另一个数组,请考虑包含指向 Objects 的指针,或者可能包含指向 Objects 的 shared_ptr 而不是 Object 类本身,但要小心并理解您正在传递指向该数组的指针,并且特定对象的唯一实例。

【讨论】:

  • 显然Object 不是库中的实际名称,仅用于此问题
猜你喜欢
  • 2018-08-19
  • 1970-01-01
  • 2011-11-22
  • 2017-11-09
  • 2015-11-07
  • 2014-03-15
  • 2021-10-27
  • 2015-01-01
  • 2013-03-07
相关资源
最近更新 更多