如何编写一个拷贝赋值操作符来处理引用

How can I write a copy assignment operator to handle references

本文关键字:赋值操作符 拷贝 处理 引用 一个 何编写      更新时间:2023-10-16

我有如下的组合:

PropertyCollection
{
  private:
    Dataset & dataset;
  public:
    PropertyCollection(Dataset & _dataset) : dataset(_dataset) {}

我需要一个vector<PropertyCollection> properties。我需要能够调用properties.resize(10, PropertyCollection(dataset));

不幸的是,vector需要一个默认构造函数PropertyCollection::PropertyCollection()来默认初始化它的元素。换句话说,当它调用resize时,它必须调用PropertyCollection::PropertyCollection()。因此,我认为,为了在调用resize时对vector进行属性初始化,需要实现默认构造函数和复制赋值操作符。

PropertyCollection
{
  private:
    Dataset & dataset;
  public:
    PropertyCollection() = default;
    PropertyCollection(Dataset & _dataset) : dataset(_dataset) {}
    PropertyCollection & operator=(const PropertyCollection & other)
    {
      dataset = other.dataset
      // error, cannot reassign a reference

不幸的是,我写一个拷贝赋值操作符的尝试失败了。不能重新分配引用。那么,我怎么做才能使向量工作呢?

扩展一下我的问题,这是其他人遇到过的问题吗?(事实上vector很难处理,因为它100%使用默认构造函数)

我不会使用引用成员。

如果您的PropertyCollection实例"拥有"Dataset,那么将Dataset设置为拥有类的正常成员并完成它。你的类应该是这样的:

PropertyCollection
{
  private:
    Dataset dataset;
  public:
    // NOTE: single-argument ctors should be made explicit
    // NOTE: and the formal parameter should be const ref
    explicit PropertyCollection(const Dataset& _dataset) : dataset(_dataset) {}
    // ...etc etc, other ctors, ...
};

如果Dataset实例在多个包含对象之间共享,则使用共享指针来表示共享的所有权:如果使用符合c++ 11的编译器,则使用std::shared_ptr<T>,否则使用Boost智能指针模板。我提到这个只是为了完整,因为我怀疑您没有这个用例。