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

时间:2019-12-14 01:05:15

标签: c++ oop

我有一个AbstractClass,它由两个类SubClass1,BaseClass继承。每个BaseClass保留两组AbstractClass的向量,用于计算id。 SubClass2继承了BaseClass,BaseSub2希望设置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);
}

2 个答案:

答案 0 :(得分:3)

在c ++中,无法访问子类中某个类的私有成员。

有3种方法可以解决此问题:

  • 将成员声明为受保护的,以便只有子类才能访问它们。

  • 声明“设置”功能,以便可以设置成员(如果只希望子类访问它们,则声明成员受保护)。

  • 在基类中创建一个构造函数,该构造函数使用某些参数或默认值初始化向量(如果只希望子类访问它们,则将其声明为受保护的),然后在其中调用子类。

答案 1 :(得分:1)

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

  

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

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

pip install kivy[base] kivy_examples --pre --extra-index-url https://kivy.org/downloads/simple/

如果您下一步要做的是,将#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() {} 移到std::vector<std::unique_ptr<AbstractClass>>的下一级别也没什么不同。