C++ 包含在具体类中的抽象类

C++ 包含在具体类中的抽象类,c++,oop,constructor,abstract-class,C++,Oop,Constructor,Abstract Class,我有一个类,作为成员,它包含另一个类。第二个类是一个抽象类,由一系列子类中的一个以通常的方式具体化。 我不确定构造全Encompating类的最佳方法,因为当它被构造时,肯定会抛出错误,因为它将尝试构造一个缺少某些方法定义的类。有谁能建议最好的解决办法吗? 干杯 杰克 编辑1:类图: Main Class | ------------------------------------ |

我有一个类,作为成员,它包含另一个类。第二个类是一个抽象类,由一系列子类中的一个以通常的方式具体化。 我不确定构造全Encompating类的最佳方法,因为当它被构造时,肯定会抛出错误,因为它将尝试构造一个缺少某些方法定义的类。有谁能建议最好的解决办法吗? 干杯 杰克

编辑1:类图:

                 Main Class
                      |
       ------------------------------------
       |                                  |
Normal Methods/Members             Abstract Class member
                                          |
                            -----------------------------
                            |                           |
                     Concrete Class 1           Concrete Class 2

因此,“主类”是我担心的结构,因为当它被调用时,抽象类成员需要以某种方式具体化,但我不确定如何最好地做到这一点。

我不完全确定我是否完全理解您的意思,但在我看来,您可以使用指针或对抽象类的引用,然后用一个具体的类初始化它

差不多

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();
    }
};

只需创建从抽象基类继承的任何具体类的实例,并将其分配给指向抽象类的指针。

给定一个抽象类
A
和两个应该包含它们的实现
B
C
enc
,我可以想出两个解决方案:

第一个具有
a
unique\u ptr
enc
看起来像:

struct enc{
    unique_ptr<A> a;
    int x;
    enc(unique_ptr<A> p): a(std::move(p)), x(0) {
    }       
};
(假设op需要某种指向
enc
中父类的指针或引用)


演示。

你能发布你的代码让你的问题更清楚吗?我不能发布代码,因为它太大了。我可以试着画一个小的类结构图,虽然你至少可以发布你的类结构…如果没有一些(简化的)示例代码来重现你的实际错误,那么很难回答这个问题。然而,短语“所有encompasing类”听起来像是一个糟糕的设计。对象应该只实现一个职责。这是继承图还是封装图?还是两者的奇怪组合?请展示一些示例代码(它不一定是实际代码,只是向我们展示您正在做什么或想要做什么的代码)。我认为您应该警告必须在
MainClass
的析构函数中调用
delete pAbstractClass
,在使用原始指针的情况下:)@Scis我对你的答案投了赞成票,因为你使用了智能指针谢谢,我很感激^_^
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) {
    }       
};