从迭代器复制C++对象

3
我将尝试构建一个对象数组,使用集合上的迭代器来获取值。
当前代码如下:
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和container是来自第三方库的类。

这段代码可以工作,但是Object的赋值操作符已被删除,它的拷贝构造函数是私有的。

此外:

当然,我可以轻松地构建一个类型为Object*[]的东西,但它与后面的库调用不兼容。

container没有“转换为数组”的方法或类似的东西。


3
如果Object无法复制,那么编写Object的人明确不希望你这样做。很可能复制操作本身也无法正常工作。所以你要么停止尝试这样做(或许可以保留一个指向Object*数组的引用,并想办法避免那个无法使用该数组的库调用),要么你必须声明他们错误并重新编写Object - Steve Jessop
3
“Object的赋值运算符被删除了,它的复制构造函数是私有的”似乎是有人不希望你复制这个“Object”…” - Fantastic Mr Fox
Object有移动构造函数和/或移动赋值运算符吗? - M.M
1个回答

0

对于其他通过搜索您的标题找到此主题的人:如果不适用不可复制的约束条件,则应像您尝试做的那样从迭代器中进行复制。

回答您的问题: 如果在第三方C++库中发现一个名为“Object”的类,则应立即将该第三方库丢进垃圾桶,并寻找由真正懂C++的人编写的替代品,而不是那些如此热爱Java(或其他具有公共基础对象的语言)的人,以至于他们决定在一个没有意义的语言中模仿其行为。我不想说话,但这是一个严重的红色警示。

然而,正如所说的那样,如果对象不可复制构造,则很可能实现Object的某些内容,而类的作者知道,您不知道,这禁止了复制。试图绕过它会导致漏洞。

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

如果您只是想将对象实例从一个数组移动到另一个数组,请考虑包含指向对象的指针或者是共享指向对象的shared_ptr,而不是直接使用Object类本身。但请注意,了解您正在传递指向特定对象的唯一实例的指针。


很明显,“Object”不是库中的实际名称,只是为了解答这个问题而使用的。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接