戦略を実装する2つのクラスを持つ戦略パターンがあり、それぞれに値のセットがありますが、値はベクターとリストなどの異なるコンテナーに格納されているとします。
各クラスの各値を調べることができるイテレータが必要です。また、標準の反復子の方法を使用できるようにしたいと思います。つまり、この方法で値を調べます。
Strategy s = //Some initialization.
Strategy :: iterator it;
for (it = s.begin(); it != s.end() ; ++it){
//Do something with *it.
}
今のところ、私が持っている唯一の解決策は次のとおりです。Strategyクラスにコンテキスト反復子がある別の戦略パターン。別の strategyIterator と、各「戦略実装クラス」には、独自のクラス selfIterator : public strategyIterator があります。
しかし、これはかなり面倒なようで、おそらく他の誰かが私よりも創造性を持っています. だから私は本当にいくつかのアイデアをいただければ幸いです:)、ありがとう!
これは、多項式を操作するプログラム用であり、戦略は多項式の表現であり、一方はベクトルを使用し、もう一方はリストを使用します。
使用したいプログラムのHファイルもここにあります:
#include <iostream>
#include <vector>
#include <list>
using namespace std;
#ifndef MYPOLY_H
#define MYPOLY_H
class PolyRep;
class RegIterator;
typedef enum Poly
{
REG_POLY = 1, SPARSE_POLY = 2
};
/* =============================================================================
* MyPoly class.
* =============================================================================*/
class MyPoly
{
public:
MyPoly(double arr[], unsigned int arrSize);
MyPoly(double num);
MyPoly(double X[], double Y[], int arrSize);
MyPoly(string sPoly);
~MyPoly();
string toString();
double evaluate(double x) const;
MyPoly derive(int n);
MyPoly & operator =(const MyPoly &rhs);
MyPoly & operator +=(const MyPoly &rhs);
MyPoly & operator -=(const MyPoly &rhs);
MyPoly & operator *=(const MyPoly &rhs);
MyPoly operator +(const MyPoly& other);
MyPoly operator -(const MyPoly& other);
MyPoly operator *(const MyPoly& other);
bool operator ==(const MyPoly& b) const;
MyPoly operator -() const;
private:
PolyRep * _poly;
};
/* =============================================================================
* PolyRep class.
* =============================================================================*/
class PolyRep
{
public:
virtual double evaluate(const double &x) const = 0;
//virtual iterator begin () = 0;
//virtual PolyRep * derive(int n) = 0;
protected:
int _degree;
};
/* =============================================================================
* RegPoly class.
* =============================================================================*/
class RegPoly : public PolyRep
{
public:
RegPoly(double arr[], int degree);
~RegPoly();
double evaluate(const double &x) const;
private:
vector <double> _values;
};
/* =============================================================================
* SparsePoly class.
* =============================================================================*/
class SparsePoly : public PolyRep
{
public:
SparsePoly(double arr[], int degree);
~SparsePoly();
double evaluate(const double &x) const;
private:
/*A class to represent a node in the SaprsePoly list.*/
class SparseNode
{
public:
SparseNode(int n = 0, double value = 0);
int getN() const;
double getValue() const;
private:
int _n;
double _value;
};
/*End of sparse node class.*/
list <SparseNode*> _values;
};
#endif /* MYPOLY_H */