如何从子类的构造函数初始化父类的私有成员

用户1775500

我有一个由两个类SubClass1,BaseClass继承的AbstractClass。每个BaseClass保留两组AbstractClass的向量,用于计算id。SubClass2继承了BaseClass,BaseClass2希望设置BaseClass的向量,是否有任何方法可以通过初始化列表来初始化BaseClass?如果我确实必须以特殊方式传递向量,因为我得到一个错误

'std::unique_ptr<AbstractClass,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function

“ project.h”

class AbstractClass {
    virtual int getId() = 0;
};

class BaseClass: public AbstractClass {
public:
    BaseClass(std::vector<std::unique_ptr<AbstractClass>> v1, std::vector<std::unique_ptr<AbstractClass>> v2)
    : vec1_(v1), vec2_(v2){
    }
    std::vector<std::unique_ptr<AbstractClass>> getVec1() {
        return vec1_;
    }
    std::vector<std::unique_ptr<AbstractClass>> getVec2() {
        return vec2_;
    }
private:
    std::vector<std::unique_ptr<AbstractClass>> vec1_;
    std::vector<std::unique_ptr<AbstractClass>> vec2_;
};

class SubClass1 : public AbstractClass {
public:
    int getId() override {
        return 1;
    }
};

class SubClass2 : public BaseClass {
public:
    SubClass2() {
        std::vector<std::unique_ptr<AbstractClass>> vec1;
        std::vector<std::unique_ptr<AbstractClass>> vec2;
        vec1.push_back(std::make_unique<SubClass1>());
        vec2.push_back(std::make_unique<SubClass1>());
        BaseClass(vec1, vec2);
    }
    //OR SubClass2(std::vector<std::unique_ptr<AbstractClass>> vec1, std::vector<std::unique_ptr<AbstractClass>> vec2): BaseClass(vec1, vec2)
    int getId() override {
        return 2;
    }
};

“ project.cpp”

#include "project.h"
int main(){
   vector<unique_ptr<AbstractClass>> objs;
   //do I instead need to pass in my vectors here so I can do SubClass2(v1, v2): BaseClass(v1, v2)?
   // std::vector<std::unique_ptr<AbstractClass>> v1;
   // v1.push_back(make_unique<SubClass1>());
   // std::vector<std::unique_ptr<AbstractClass>> v2;
   // v2.push_back(make_unique<SubClass1>());
   // std::make_unique<SubClass2>(v1, v2);
   vector.push_back(make_unique<SubClass2>());
   doSomething(objs);
}
泰德·林格莫

如评论部分所示,我不太了解您想完成什么,但是

如何通过子类的构造函数初始化父类的私有成员,而无需通过初始化列表?

似乎是一个人为的问题。我怀疑避免成员初始化器列表是主要目的,因此这是使用它的方法。

#include <iostream>
#include <memory>
#include <utility>
#include <vector>

class AbstractClass {
public:
    virtual int getId() = 0;
    virtual ~AbstractClass() = default;
};

// headache-saving alias
using vac_ptr = std::vector<std::unique_ptr<AbstractClass>>;

class BaseClass : public AbstractClass {
public:
    // moving, not copying
    BaseClass(vac_ptr&& v1, vac_ptr&& v2) : vec1_(std::move(v1)), vec2_(std::move(v2)) {}

    // references, not copies
    vac_ptr& getVec1() { return vec1_; }
    vac_ptr& getVec2() { return vec2_; }

private:
    vac_ptr vec1_;
    vac_ptr vec2_;
};

class SubClass1 : public AbstractClass {
public:
    int getId() override { return 1; }
};

class SubClass2 : public BaseClass {
private:
    // verbose helpers that you can fill with stuff
    vac_ptr filler1() {
        vac_ptr vec1;
        vec1.emplace_back(std::make_unique<SubClass1>());
        return vec1; // RVO
    }
    vac_ptr filler2() {
        vac_ptr vec2;
        vec2.emplace_back(std::make_unique<SubClass1>());
        return vec2; // RVO
    }

public:
    // temporaries, moved into base - via the member initializer list
    SubClass2() : BaseClass(filler1(), filler2()) {}
    int getId() override { return 2; }
};

int main() {}

如果这是您下一步要执行的操作,则将astd::vector<std::unique_ptr<AbstractClass>>移到a的下一个层次SubClass2也没有什么不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java Mockito-如何模拟在构造函数中初始化的私有成员

构造函数中私有成员初始化的差异(C++)

初始化类的私有成员变量

子类成员初始化器覆盖父类构造函数

如何在C ++ 11中初始化未初始化其构造函数中所有成员的类

(复制构造函数)作为参数传递来初始化另一个对象的对象如何访问私有成员?

子类访问父类中的私有成员变量

聚合初始化绕过私有类构造函数

是否可以使用基类构造函数使用派生类将值初始化为基类私有成员?

实例初始化器与私有成员

从子类初始化私有变量

继承和复制构造函数-如何从基类初始化私有字段?

具有成员初始化列表的显式副本构造函数中的空值

默认构造函数是否总是初始化所有成员?

如何在C ++中使用构造函数(只是构造函数)在类中初始化大型私有数组?

综合默认构造函数如何初始化已初始化的类成员?

如何使用构造函数以非常量引用作为参数的私有对象成员初始化对象

访问类构造函数的初始化列表中的父成员

为什么我不能在类定义中直接初始化私有成员变量

初始化 const 成员并使用父构造函数

如何初始化具有构造函数的动态类

C++ 成员初始化器列表问题:私有成员变量的声明顺序

如何在运行时使用构造函数初始化类中私有的数组?

在具有私有构造函数的类中初始化静态变量

初始化私有变量的抽象类的Fortran构造函数

如何在派生类构造函数中初始化基类成员变量?

构造函数未初始化嵌套类的成员

在构造函数中初始化类成员变量

使用私有构造函数进行静态初始化