【发布时间】:2020-06-20 20:31:52
【问题描述】:
我有一个类Foo 没有合理的默认构造函数。我还希望将复制分配运算符保密,尽管这可能变得不可能。 (我想通过拥有const 字段和少量将 const 方式转换为私有且在对象生命周期早期的变异器,使类“几乎”不可变,从而实现线程安全。)
在这些限制下创建std::vector<Foo> 有点挑战。我想出了一个我在其他地方没有见过的解决方案(例如,参见之前的 SO 问题 1)。我有一个自定义迭代器,在取消引用时会创建一个Foo。它的设置使得每次调用都递增到向量中的下一个值Foo。序列很容易定义。我在CustomIterator 上定义了operator++、next、advance、distance 和operator*。
那我有
std::vector<Foo> foo_vec{CustomIterator(0), CustomIterator(size_of_vector)};
没有访问问题。没有不必要的结构。没有副本。有人发现这有问题吗?
【问题讨论】:
-
这看起来很酷,但为什么呢?只需在您的类中创建一个静态方法,该方法将返回初始化对象的向量。
-
类中的静态方法如何创建要返回的向量? (这解决了 operator= 问题,并且可能在其他地方有用。)
-
Factory pattern 是你的朋友。
-
你不能把元素
emplace_back放到向量中吗?这只需要复制或移动构造函数,不需要复制或移动赋值运算符。 -
@Brian 是的,我可以有一个空向量,然后在循环中使用
emplace_back对其进行初始化。
标签: c++ collections default-constructor