代码之家  ›  专栏  ›  技术社区  ›  Yannic

C++将抽象类型的动态分配对象传递给函数并存储在向量中

  •  0
  • Yannic  · 技术社区  · 6 年前

    在调用端,我想通过流运算符传递特定超级类的任意对象:

    class SubclassA : public Superclass { ... }
    class SubclassB : public Superclass { ... } 
    
    ...
    
    Container container;
    container << SubclassA(param1, param2) << SubclassB(param);
    

    在被调用方,我必须将所有传递的对象存储在一个向量或列表中:

    std::vector<std::unique_ptr<Superclass>> childs;
    Container & operator<<(Superclass const & child) {
      childs.emplace_back(new Superclass(child)); // not possible, since Superclass is abstract 
      return *this;
    }
    

    有没有可能保持被调用方的期望行为,避免 std::unique_ptr new 关键词?

    编辑 : 添加缺少的 & 流内运算符参数。

    1 回复  |  直到 6 年前
        1
  •  1
  •   1201ProgramAlarm    6 年前

    你需要加上两件事才能成功。

    第一, operator<< 需要 引用它的参数。否则你有 object slicing .

    其次,您需要添加一个虚拟 clone 方法到 Superclass 由所有派生类实现的。此方法将复制自身并返回指向它的指针。

    class Superclass {
    public:
        virtual Superclass *clone() const;  // optionally can be abstract
        // ...
    };
    
    Container & operator<<(Superclass const &child) {
      childs.emplace_back(child.clone());
      return *this;
    }
    
    class SubclassA : public Superclass {
        SubclassA *clone() const override {
            return new SubclassA(*this);
        }
    };
    

    这依赖于从指针创建独特的指针。由于目前不鼓励使用任何类型的原始指针,请参见 this answer 为了克服智能指针和协变返回类型无法相处和使用的限制 unique_ptr 直接的。

    推荐文章