[英]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.