【问题标题】:Abstract class contained within concrete class包含在具体类中的抽象类
【发布时间】:2014-09-11 22:25:01
【问题描述】:

我有一个类,它作为成员包含另一个类。第二个类是一个抽象类,由一系列子类中的一个以通常的方式具体化。 我不确定构造包罗万象的类的最佳方法,因为当它被构造时,肯定会抛出错误,因为它会尝试构造一个缺少其某些方法定义的类。任何人都可以建议解决这个问题的最佳方法吗? 干杯, 杰克

编辑1:类图:

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

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

【问题讨论】:

  • 您可以发布您的代码以使您的问题更清楚吗?
  • 我无法发布代码,因为它非常庞大。不过我可以试着画一个小类结构图
  • 你至少可以发布你的类结构...
  • 如果没有一些(简化的)示例代码可以重现您的实际错误,很难回答这个问题。然而,“包罗万象的类”这个短语听起来像是一个糟糕的设计。对象应该为一个职责而实现。
  • 那是继承图,还是封装图?还是两者的奇怪组合?请展示一些示例代码(它不必是实际代码,只需向我们展示您在做什么或您想要什么)。

标签: c++ oop constructor abstract-class


【解决方案1】:

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

类似

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

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

【讨论】:

  • 我认为你应该警告你必须在MainClass的析构函数中调用delete pAbstractClass,以防使用原始指针:)
  • @Scis 我赞成您的回答,只是因为您使用了智能指针。 :)
  • 谢谢 ^_^
【解决方案2】:

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

第一个具有unique_ptrAenc 看起来像:

struct enc{
    unique_ptr<A> a;
    int x;
    enc(unique_ptr<A> p): a(std::move(p)), x(0) {
    }       
};

演示here.

我碰巧想到的第二个解决方案,我不确定是一个好主意,但为了多功能性我会发布(或者找出它是否有我没有想到的缺陷) .在AB 是一些默认的可构造类的情况下使用模板

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.

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2020-08-26
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多