0

関数を作成したいのですが、さまざまなコンテキストでは、さまざまな名前で呼び出す方が適切です。

class box(){
    private:
    float posX;
    float size = 10;
    public:
    float speedX;
    float left(){ return posX; } //Any way to combine these?
    float posX(){ return posX; } //Any way to combine these?
    float right(){ return posX + size; }
};

box a;
box b;

bool checkCollide(){
    if(a.right() < b.left()){ return 0; } //Not colliding
    if(b.right() < a.left()){ return 0; } //Not colliding
    return 1; //Colliding
} //Comparing right and left makes more sense than anything else

void physics(){
    a.posX() += a.speedX;
    b.posX() += b.speedX;
    //Adding speed to position makes more sense than
    //adding speed to "left"
}
//Loop physics X times per second, and do something if there's a collision

または、これを行うより良い方法はありますか?呼び出しごとに再計算するのではなく、位置またはサイズが変更されるたびに左/右メンバーを自動的に更新することはできますか?

4

3 に答える 3

3

本当にこれを行う義務がある場合は、一方の関数をもう一方の関数に呼び出してください:

// the function that does the hard job
float foo(float a, float b)
{
    // some heavy and complicated code
    // ...
    // some more black magic, etc.
    // finally:
    return sqrt(a * a + b * b);
}

// the function that pretends to do the hard job
float bar(float a, float b)
{
    return foo(a, b);
}

でもこれはやらないほうがいいですよ、かなりスタイルが悪いです。異なる名前 => 異なるタスク。同じタスク => 同じ名前。仲間の直感を傷つけないでください... ;-)

于 2013-03-02T05:58:14.540 に答える
0

はい - 最初に同じことを行う 2 つの関数を記述しないでください。発散しないことを願うばかりです。その後、問題があります。

于 2013-03-02T05:59:42.730 に答える
0

C++11 を使用している場合、または Boost を使用している場合は、left()関数をstd::function変数にバインドできます。C++11 の場合:

class box {
// ...
public:
    // ...
    float left() { return posX; }
    const std::function<float()> posx = std::bind(&box::left, this);

constが必要です。それ以外の場合posxは、実行時に別の関数を指すように変更できます。

C++11 コンパイラを使用しておらず、代わりに Boost を使用している場合はposx、ctor で初期化する必要があるため、それほど表現力がありません。

class box {
// ...
public:
    box() : posx = boost::bind(&box::left, this);
    // ...
    float left() { return posX; }
    const boost::function<float()> posx;

どちらの場合でも、次のことができるようになりました。

box b;
b.left();
b.posx();

posx()このメソッドには、関数を持ってそれを呼び出すことに比べて、私が考えることができる利点はありませんleft()。しかし、それは可能であり、言及する価値があります.

しかし、H2CO3 が言ったことには同意します。同じ機能に 2 つの名前を付けないでください。ややこしい。

于 2013-03-02T13:40:36.287 に答える