我有一个由两个类SubClass1,BaseClass继承的AbstractClass。每个BaseClass保留两组AbstractClass的 vector ,用于计算id。 SubClass2继承了BaseClass,BaseClass2希望设置BaseClass的 vector ,是否有任何方法可以通过初始化列表来初始化BaseClass?如果我确实必须以特殊方式传递 vector ,因为我得到一个错误
'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() {}
下一步,将
std::vector<std::unique_ptr<AbstractClass>>
移到SubClass2
并没有什么不同,如果这是您接下来要执行的操作。关于c++ - 如何从子类的构造函数初始化父类的私有(private)成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59331505/