C++ 策略模式和在策略中编辑基类字段
对不起我的英语。 现在我尝试实施战略模式 ObjectBase.hC++ 策略模式和在策略中编辑基类字段,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
#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