私のプログラムには、次のような Car および CarManager クラスがあります。
#include <list>
class Car
{
public:
void Draw() { Draw(m_opacity); }
void Draw(float opacity)
{
}
private:
float m_opacity;
};
class CarManager
{
public:
//Draw cars using their m_opacity member
void DrawCars()
{
for(auto i = m_cars.begin(); i != m_cars.end(); i++)
i->Draw();
}
//Draw cars using opacity argument
void DrawCars(float opacity)
{
for(auto i = m_cars.begin(); i != m_cars.end(); i++)
i->Draw(opacity);
}
private:
std::list<Car> m_cars;
}
MyApplication::OnRender()
{
CarManager* pCarManager = GetCarManager();
//If this condition is met, I want all cars to be drawn with 0.5 opacity.
if(condition)
pCarManager->DrawCars(0.5f);
//Otherwise, draw cars using their m_opacity value.
else
pCarManager->DrawCars();
}
C++ では、非静的メンバーを既定の引数として使用することは許可されていないため、Drawing 関数をオーバーロードしました。引数が指定されていない場合、オーバーロードされたバージョンの関数がクラス メンバーを使用して呼び出されます。
各車には、レンダリングに使用される m_opacity メンバーがあります。ただし、すべての車で使用する不透明度の値を指定したい場合があります。これらの場合、私が提供する値を優先して m_opacity を無視したいと思います。
この例では、CarManager::DrawCars() のレンダリング コードはかなり小さいので、Car::Draw() への別の呼び出しで同じコードを繰り返しても大したことではありません。しかし、私の実際のプログラムでは、同じコードをすべて繰り返すことは実用的ではありません。
これは面倒になり始めています。これについてもっと良い方法はありますか?