装饰设计模式,分段故障

时间:2017-05-24 11:01:05

标签: c++ design-patterns decorator

我想实现Decorator设计模式。但是,我的代码给了我Segmentation fault错误。我尝试使用-g标志对其进行编译,然后使用gdb进行检查。 gdb仅显示错误位于action方法中的某个位置,但我不明白其中的位置和原因。

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

class CComponent
{
protected:
    int * i_array;
    int i_size;
public:
    CComponent(int i_size)
    {
        this->i_size=i_size;
        i_array= new int[i_size];
        for(int i=0; i<i_size; i++)
        {
            i_array[i]=0;
        }
    }
    virtual int action() = 0;
    ~CComponent()
    {
        delete i_array;
    }
    int get_i_size()
    {
        return i_size;
    }
    int get_array_at(int index)
    {
        return i_array[index];
    }
};

class CConcreteCComponent : public CComponent
{

public:

    CConcreteCComponent(int i_size) : CComponent(i_size) { }

    int action()
    {
        for(int i=0; i<i_size; i++)
        {
            i_array[i] = rand() % 100;
            cout<< i_array[i] << " " << endl;
        }
        return 0;
    }
};

class Decorator : public CComponent
{
protected:
    CComponent * c;
public:
    Decorator(int i_size) : CComponent(i_size)
    {
        c = new CConcreteCComponent(100);
    }
    int action()
    {
        return c->action();
    }
};

class CConcreteDecorator3 : public Decorator
{

public:
    CConcreteDecorator3(int i_size) : Decorator(i_size)
    {
    }

    int action()
    {
        int w = action();
        for(int i=0; i<c->get_i_size(); i++)
            if(c->get_array_at(i) % 2 == 0)
                return w;
        return w + 50;
    }
};

class CConcreteDecorator1 : public Decorator
{
public:
    CConcreteDecorator1(int i_size) : Decorator(i_size)
    {
    }

    int action()
    {
        int w = action();

        if(c->get_array_at(0) == 0 && c->get_array_at(i_size -1) == 0)
            return w + 100;
        return w;

    }

};

class CConcreteDecorator2 : public Decorator
{
public:
    CConcreteDecorator2(int i_size) : Decorator(i_size)
    {
    }

    int action()
    {
        int w = action();

        if(c->get_i_size() > 7)
            return w + 150;
        return w;
    }

};

int main()
{
    Decorator * d = new CConcreteDecorator3(100);
    Decorator * d2 = new CConcreteDecorator1(100);
    Decorator * d3 = new CConcreteDecorator2(100);
    int res;

    res = d->action();
    cout << "res :" << res << endl;

    return 0;
}

2 个答案:

答案 0 :(得分:2)

原因是无限回归。

行动方法中的 CConcreteDecorator3 而不是:

int w = action();

您应该使用:

int w = Decorator::action();

答案 1 :(得分:0)

...此外

  1. 您的Decorator类泄漏。你没有带删除的析构函数。
  2. 它被认为是使用std::vector<int>不是int * i_array和一个std ::的unique_ptr为CComponent * c;不要打扰使用新/删除,除非你无法避免它。
  3. 您的CComponent需要一个虚拟析构函数。如果你使用谷歌多态和虚拟析构函数,你会发现很多解释。