对象本身作为参数的对象上的 C++ 调用方法

C++ call method on object with the object itself as parameter

例如,

在 python 中,您可以调用 array.sort() ,它将对调用它的数组进行排序。但是,我现在有以下代码片段

void drawClickableRectangle(ClickableRectangle recto){
        ofSetHexColor(0xffffff);             // just some syntax from the library I'm using
        ofFill();
        ofDrawRectangle(recto.xpos, recto.ypos, recto.width, recto.height);
    }

然后在这里调用这个方法:

ClickableRectangle recto(1,1,100,100);
recto.drawClickableRectangle(recto);

这是完整的 class:

class ClickableRectangle
{
    // Access specifier
public:


    // Data Members
    int xpos, ypos, width, height;
    ClickableRectangle(int x1, int y1, int width1, int height1){
        xpos = x1;
        ypos = y1;
        width = width1;
        height = height1;
    };
    // Member Functions()
    int getxpos()
    {
        return xpos;
    }
    int getypos(){
        return ypos;
    }
    int getwidth(){
        return width;
    }
    void drawClickableRectangle(ClickableRectangle recto){
        ofSetHexColor(0xffffff);
        ofFill();
        ofRect(recto.xpos,recto.ypos, recto.width, recto.height);
        //ofDrawRectangle(recto.xpos, recto.ypos, recto.width, recto.height);
    }

有没有办法调用函数"reflexive"?所以我可以这样称呼它:

recto.drawClickableRectange();

我对 C++ 比较陌生,但对一般编程不是很熟悉。谢谢!

你可以在 C++ 中这样做:

class ClickableRectangle {

    public int xpos;
    public int ypos;
    public int width;
    public int height;

    void drawClickableRectangle(){
        ofSetHexColor(0xffffff);             // just some syntax from the library I'm using
        ofFill();
        ofDrawRectangle(xpos, ypos, width, height);
    }
}

然后在你的主函数中,这样调用它:

int main(){

    ClickableRectangle recto;
    recto.xpos = 1;
    recto.ypos = 1;
    recto.width = 100;
    recto.height = 100;
    recto.drawClickableRectange();
    return 0;
}

与python不一样,不。

在python中,您可以

def unattached(fake_self):
    return fake_self.x

class Thing:
    def __init__(self):
        self.x = 42

Thing.method = unattached

thing = Thing()
print (thing.method())
print (unattached(thing))

因为带有显式第一个参数的自由函数和带有隐式第一个参数的实例方法没有区别。

在 C++ 中,您无法在运行时更改 class,并且成员函数的类型与自由函数不同。

struct Thing {
    int x = 42;
    int method() const { return this->x; }
}

int unattached(const Thing * thing) { return thing->x; }

unattached 的类型是 int (*)(const Thing *),而 methodint (const Thing::*)()。这些是不同的类型,您不能将一种换成另一种。但是,您 可以 从其中的 任一个 构造一个 std::function<int(const Thing *)>,但是您只能将其与自由函数语法一起使用 func(thing),因为它不是 Thing

的成员