简体   繁体   English

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

[英]How to initialize private members of parent class from subclass's constructor

I have an AbstractClass that is inherited by two classes SubClass1, BaseClass.我有一个由两个类 SubClass1 和 BaseClass 继承的 AbstractClass。 Each BaseClass keeps two sets of vectors of AbstractClasses which it uses calculate an id.每个 BaseClass 保留两组抽象类向量,它使用它计算一个 id。 BaseClass is inherited by SubClass2 which wants to set vectors of BaseClass, is there any way to initialize BaseClass without going through the initalizer list? BaseClass 是由 SubClass2 继承的,它想设置 BaseClass 的向量,有没有办法在不通过初始化器列表的情况下初始化 BaseClass? If I do have to pass in the vectors in a special way because I get an error如果我必须以特殊方式传入向量,因为我收到错误

'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" “项目.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" “项目.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);
}

In c++ is impossibile to access the private members of a class in a sub-class.在 C++ 中,无法访问子类中的类的私有成员。

There are 3 methods to remedy this:有3种方法可以解决这个问题:

  • declare the members as protected so that only the sub-classes can access them.将成员声明为受保护的,以便只有子类可以访问它们。

  • declare "set" functions so that the members can be setted (declare them protected if you want only the sub-classes access them).声明“设置”函数,以便可以设置成员(如果您只希望子类访问它们,则声明它们受保护)。

  • create a costructor in base class that initialize the vector with some parameter or with a default (declare it protected if you want only the sub-classes access them) and then call it in the sub-classes.在基类中创建一个 costructor,用一些参数或默认值初始化向量(如果您只希望子类访问它们,则声明它受保护),然后在子类中调用它。

As shown in the comment section, I don't really understand what you want to accomplish, but如评论区所示,我不是很明白你想完成什么,但是

How to initialize private members of parent class from subclass's constructor [...] without going through the initalizer list?如何在不通过初始化器列表的情况下从子类的构造函数 [...] 初始化父类的私有成员?

seems like a constructed problem.似乎是一个构造问题。 I doubt avoiding the member initializer list is the main purpose, so here's how you could do it using it.我怀疑避免成员初始值设定项列表是主要目的,所以这里是您如何使用它。

#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() {}

The next level, moving a std::vector<std::unique_ptr<AbstractClass>> into a SubClass2 is no different if that's what you want to do next.下一个级别,将std::vector<std::unique_ptr<AbstractClass>>移入SubClass2并没有什么不同,如果这是您接下来想要做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从其私有构造函数访问类的私有成员 - How to access private members of a class from it's private constructor 使用父类中的私有成员调用父构造函数 - Call parent constructor with private members in parent class 如何在c ++中初始化类的私有成员 - how to initialize private members of class in c++ 如何使用私有构造函数中的引用成员初始化类? - How can you initialize a class with a reference member from a private constructor? 如何在不创建构造函数的情况下使用私有/受保护成员初始化 POD 结构? - How to initialize POD struct with private/protected members without creating constructor? 如何使用来自构造函数的信息初始化成员 - How To Initialize Members Using Information from the Constructor 如何将基类的私有成员复制到派生类的复制构造函数中 - How to copy private members of a base class in to a derived class's copy constructor 是否可以使用基类构造函数使用派生类将值初始化为基类私有成员? - Is it possible to use the base class constructor to initialize values to base class private members using derived class? 如何使用 C++ 中的朋友 function 初始化 class 的私有成员? - How to initialize private members of a class using a friend function in C++? 如何从派生的构造方法初始化列表初始化模板基类的成员? - How to initialize members of template-base class from derived constructor initializer list?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM