0

継承階層の 1 つで重複したコードに問題が発生しています。関数 smile() 内のコードの重複を避けるにはどうすればよいですか?

_a変数が基本クラスに存在しないという事実を考えると、そこに関数を移動することはできません。また、このようなテンプレート関数を作成することtemplate<typename T> void smile(T& a) { a++; }は、私にとって実際には解決策ではありません. 私の実際のコードはもう少し複雑で、現在の設計に適用するのは不可能ではないにしても、そのような解決策は非常に面倒です。

class com
{
public:
   com(int x, float y) : _x(2), _y(1.15f)
   {   }
protected:
   // Common functions go here .We need this base class.
protected:
   int _x;
   float _y;
};

class com_int : public com
{
public:
   void fill()
   { _a = std::max(_x, (int)_y); }
protected:
   int _a;
};

class com_real : public com
{
public:
   void fill()
   { _a = std::min((float)_x, _y); }
protected:
   float _a;
};

class happy_int : public com_int
{
public:
   void smile() { _a ++; } // BAD: Will be duplicated
};

class happy_float : public com_real
{
public:
   void smile() { _a ++; } // BAD: Duplicated code
}

class sad_int : public com_int
{
public:
   frown() { _a --; }
}

また、OOP とテンプレートの原則を使用して C++ でコードを実際に設計する方法を教えている良い本を知っている人はいますか?

4

1 に答える 1

1

別のヘルパー テンプレートから継承できます。

template <typename T, typename Derived> struct filler
{
    T _a;
    void fill()
    {
        com & b = static_cast<Derived&>(*this);
        _a = std::min(b._x, b._y);
    }
};

使用法:

struct com_int : com, filler<int, com_int> { };
于 2012-07-15T23:43:45.800 に答える