如何从子类的构造函数初始化父类的私有成员
How to initialize private members of parent class from subclass's constructor
我有一个由两个类子类1继承的抽象类,BaseClass。每个 BaseClass 保留两组 AbstractClasses 向量,它使用这些向量计算一个 id。 BaseClass 由想要设置 BaseClass 向量的 SubClass2 继承,有没有办法在不通过发起器列表的情况下初始化 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
"项目.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;
}
};
"项目.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);
}
在 c++ 中,访问子类中类的私有成员是不可能的。
有 3 种方法可以解决此问题:
-
将成员声明为受保护,以便只有子类可以访问它们。
声明 "set"函数,以便可以设置成员(如果希望只有子类访问它们,则声明它们受保护(。
在基类中创建一个 costructos,它使用某个参数或默认值初始化向量(如果希望只有子类访问它们,则声明它受保护(,然后在子类中调用它。
如评论部分所示,我真的不明白你想完成什么,但是
如何在不通过发起器列表的情况下从子类的构造函数初始化父类的私有成员?
似乎是一个构造的问题。我怀疑避免成员初始值设定项列表是主要目的,所以这是如何使用它来做到这一点。
#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>>
移动到SubClass2
中,如果这是您接下来要做的事情,那就没有什么不同了。
相关文章:
- 从模板化父类中的派生内部类访问受保护的成员变量
- 如何从子类的构造函数初始化父类的私有成员
- 父类和子类中的 C++ 同名成员
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 对象在称为指向父类的指针时会丢失其成员的数据
- 将对象强制转换为派生类以访问父类的受保护成员
- 将子类的成员函数强制转换为父类
- 如何将派生类作为函数参数传递:如果派生类成员不在父类中怎么办
- 如何访问存储在父类中的子类成员
- C 不能将带有父类指针作为类型的静态模板成员定义引用
- 如何使用来自同名父类的成员函数(通过 this->)?
- 使父类成员对每个派生类不可修改
- 访问父类的成员"Invalid use of non-static data member" C++
- 使用父类中的私有成员调用父构造函数
- 带模板的继承(访问子类成员函数内父类的变量和对象)
- 如果成员对象是父类的一部分,则无法创建成员对象
- 子类不是父类的静态成员
- 在Mac OSX Yosemite上,编译器无法识别父类成员变量(Apple LLVM 7.0)
- 模板:父类成员变量在继承的类中不可见
- 共享父类成员的子类