我有一个类,其中包含另一个类的成员。第二类是一个抽象类,由一系列子类中的一个以通常的方式具体化。 我不确定构建全包类的最佳方法,当然,当构造它时,将抛出错误,因为它将尝试构造一个缺少其某些方法定义的类。有人可以建议最好的解决方法吗? 干杯, 千斤顶
编辑1:类图:
Main Class
|
------------------------------------
| |
Normal Methods/Members Abstract Class member
|
-----------------------------
| |
Concrete Class 1 Concrete Class 2
所以'主要班级'是我担心的结构,因为当它被调用时,抽象类成员需要以某种方式具体化,但我不确定如何做到这一点。
答案 0 :(得分:1)
给定一个抽象类A
和两个实现B
,C
和enc
应该包含它们,我可以想到两个解决方案:
第一个unique_ptr
A
,enc
看起来像:
struct enc{
unique_ptr<A> a;
int x;
enc(unique_ptr<A> p): a(std::move(p)), x(0) {
}
};
演示here。
我碰巧想到的第二个解决方案,我不确定是一个好主意,但我会发布为了多功能性(或者发现它是否有我没想到的缺陷) 。在案例A
中使用模板,B
是一些默认的可构造类
template <class T>
struct enc{
T in; // should be private, I'm just lazy :)
A &a;
int x;
enc(): in(T()), a(in), x(0) {
}
};
(假设op需要某种指针或对enc
中的父类的引用)
演示here。
答案 1 :(得分:0)
我不完全确定我是否理解你的意思,但在我看来,你可以使用指针或对抽象类的引用,然后用一个具体的类初始化它。
像
这样的东西class MainClass
{
class AbstractClass
{
public:
virtual void SomeFunction() = 0;
...
};
class ConcreteClass : public AbstractClass
{
public:
ConcreteClass() {}
void SomeFunction() { ... }
...
};
AbstractClass* pAbstractClass;
public:
MainClass()
: pAbstractClass(new ConcreteClass)
{}
virtual ~MainClass()
{
delete pAbstractPointer;
}
...
void AnotherFunction()
{
pAbstractClass->SomeFunction();
}
};
只需创建一个继承自抽象基类的具体类的实例,并指定给抽象类的指针。