C++ 策略模式和在策略中编辑基类字段

C++ 策略模式和在策略中编辑基类字段,c++,oop,design-patterns,C++,Oop,Design Patterns,对不起我的英语。 现在我尝试实施战略模式 ObjectBase.h #pragma once #include "canFill.h" class ObjectBase { public: ObjectBase(); virtual ~ObjectBase(); void fill(unsigned int value); void setOilValue(unsigned int value); protected: std::unique_ptr

对不起我的英语。 现在我尝试实施战略模式

ObjectBase.h

 #pragma once

#include "canFill.h"
class ObjectBase
{
public:
    ObjectBase();
    virtual ~ObjectBase();
    void fill(unsigned int value);
    void setOilValue(unsigned int value);
protected:
     std::unique_ptr<IFilliable> filliableBehavior;
private:
    unsigned int oilValue;
};
 #pragma once

#include "ObjectBase.h"
class Car : public ObjectBase
{
public:
    Car();
};
 #pragma once
#include "ObjectBase.h"

class ElectricCar : public ObjectBase
{
public:
    ElectricCar();
    ~ElectricCar();
};
 #pragma once

class IFilliable
{
public:
    virtual ~IFilliable() {}
    virtual void fill(unsigned int fillValue) = 0;
};


#endif // IFilliable_H
#pragma once
#include "IFilliable.h"

// Implementation of IMoveable Interface
class CanFill : public IFilliable
{
public:
    CanFill() {}
    ~CanFill() {}
    void fill(unsigned int fillValue);
};
#pragma once
#include "IFilliable.h"

class CantFill: public IFilliable
{
public:
    CantFill() {}
    ~CantFill() {}
    void fill(unsigned int fillValue);
};
电动汽车.h

 #pragma once

#include "canFill.h"
class ObjectBase
{
public:
    ObjectBase();
    virtual ~ObjectBase();
    void fill(unsigned int value);
    void setOilValue(unsigned int value);
protected:
     std::unique_ptr<IFilliable> filliableBehavior;
private:
    unsigned int oilValue;
};
 #pragma once

#include "ObjectBase.h"
class Car : public ObjectBase
{
public:
    Car();
};
 #pragma once
#include "ObjectBase.h"

class ElectricCar : public ObjectBase
{
public:
    ElectricCar();
    ~ElectricCar();
};
 #pragma once

class IFilliable
{
public:
    virtual ~IFilliable() {}
    virtual void fill(unsigned int fillValue) = 0;
};


#endif // IFilliable_H
#pragma once
#include "IFilliable.h"

// Implementation of IMoveable Interface
class CanFill : public IFilliable
{
public:
    CanFill() {}
    ~CanFill() {}
    void fill(unsigned int fillValue);
};
#pragma once
#include "IFilliable.h"

class CantFill: public IFilliable
{
public:
    CantFill() {}
    ~CantFill() {}
    void fill(unsigned int fillValue);
};
电动汽车.cpp

#include "ObjectBase.h"

ObjectBase::ObjectBase()
{
    filliableBehavior = std::make_unique<CanFill>();
}
ObjectBase::~ObjectBase()
{

}
void ObjectBase::fill(unsigned int value)
{
    filliableBehavior->fill(value); // should I also pass this here or I shouldn't use this pattern?
}
#include "electriccar.h"
#include "cantFill.h"

    ElectricCar::ElectricCar()
    {
        filliableBehavior = std::make_unique<CantFill>();
    }
    ElectricCar::~ElectricCar()
    {

    }
#include "canFill.h"
#include <iostream>

void CanFill::fill(unsigned int fillValue)
{
    std::cout << "filled:" << fillValue << std::endl;
    // change oilValue of the base class here
}
#include "cantFill.h"
#include <iostream>

void CantFill::fill(unsigned int fillValue)
{
    std::cout << "this object can't be filled " << fillValue << std::endl;
}
canFill.h

 #pragma once

#include "canFill.h"
class ObjectBase
{
public:
    ObjectBase();
    virtual ~ObjectBase();
    void fill(unsigned int value);
    void setOilValue(unsigned int value);
protected:
     std::unique_ptr<IFilliable> filliableBehavior;
private:
    unsigned int oilValue;
};
 #pragma once

#include "ObjectBase.h"
class Car : public ObjectBase
{
public:
    Car();
};
 #pragma once
#include "ObjectBase.h"

class ElectricCar : public ObjectBase
{
public:
    ElectricCar();
    ~ElectricCar();
};
 #pragma once

class IFilliable
{
public:
    virtual ~IFilliable() {}
    virtual void fill(unsigned int fillValue) = 0;
};


#endif // IFilliable_H
#pragma once
#include "IFilliable.h"

// Implementation of IMoveable Interface
class CanFill : public IFilliable
{
public:
    CanFill() {}
    ~CanFill() {}
    void fill(unsigned int fillValue);
};
#pragma once
#include "IFilliable.h"

class CantFill: public IFilliable
{
public:
    CantFill() {}
    ~CantFill() {}
    void fill(unsigned int fillValue);
};
canFill.cpp

#include "ObjectBase.h"

ObjectBase::ObjectBase()
{
    filliableBehavior = std::make_unique<CanFill>();
}
ObjectBase::~ObjectBase()
{

}
void ObjectBase::fill(unsigned int value)
{
    filliableBehavior->fill(value); // should I also pass this here or I shouldn't use this pattern?
}
#include "electriccar.h"
#include "cantFill.h"

    ElectricCar::ElectricCar()
    {
        filliableBehavior = std::make_unique<CantFill>();
    }
    ElectricCar::~ElectricCar()
    {

    }
#include "canFill.h"
#include <iostream>

void CanFill::fill(unsigned int fillValue)
{
    std::cout << "filled:" << fillValue << std::endl;
    // change oilValue of the base class here
}
#include "cantFill.h"
#include <iostream>

void CantFill::fill(unsigned int fillValue)
{
    std::cout << "this object can't be filled " << fillValue << std::endl;
}
cantFill.cpp

#include "ObjectBase.h"

ObjectBase::ObjectBase()
{
    filliableBehavior = std::make_unique<CanFill>();
}
ObjectBase::~ObjectBase()
{

}
void ObjectBase::fill(unsigned int value)
{
    filliableBehavior->fill(value); // should I also pass this here or I shouldn't use this pattern?
}
#include "electriccar.h"
#include "cantFill.h"

    ElectricCar::ElectricCar()
    {
        filliableBehavior = std::make_unique<CantFill>();
    }
    ElectricCar::~ElectricCar()
    {

    }
#include "canFill.h"
#include <iostream>

void CanFill::fill(unsigned int fillValue)
{
    std::cout << "filled:" << fillValue << std::endl;
    // change oilValue of the base class here
}
#include "cantFill.h"
#include <iostream>

void CantFill::fill(unsigned int fillValue)
{
    std::cout << "this object can't be filled " << fillValue << std::endl;
}
#包括“cantFill.h”
#包括
void CantFill::fill(无符号int fillValue)
{

std::cout与您的问题无关,但您可以用
#pragma替换include-guard一次
。除了实际问题之外,您还有内存泄漏:
ElectricCar::ElectricCar(){/*已调用父构造函数!*/moveableBehavior=new CantFill();}
但是父构造函数已经创建了另一个行为对象,您不能删除它!建议:让
ObjectBase
的构造函数接受一个IFillable对象作为参数,派生类也提供相应的参数。离题:习惯使用构造函数的初始化器列表(不要与
std::initializer_list]混淆)
ObjectBase(IFillable*f):行为(f){}
;您避免默认初始化+赋值,而是通过值直接初始化;请注意某些类型(非默认可构造类型、引用、常量成员等)只有这样才能进行初始化。@Aconcagua谢谢,我应该如何删除它?@Mansoor