Доступ к этому указателю в статической функции в cpp - PullRequest
0 голосов
/ 26 мая 2019

У меня есть класс cpp и несколько методов, определенных в нем. Один из статических методов должен вызывать нестатический метод того же класса. Я не могу сделать это, используя указатель «this», как в статической функции указатель «this» не может быть использован.

Мне нужно как-то получить доступ к указателю на тот же класс в статическом методе в cpp ... Может кто-нибудь PLS помочь

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Пусть статическая функция принимает эталонный параметр класса. Пример:

struct Foo {
    void func() { }

    static void static_func(Foo& obj)
    {
        obj.func();
    }
};

Использование:

Foo foo;
Foo::static_func(foo);

Вместо этого вы можете использовать параметр Foo* obj. В этом случае вам нужно явно передать указатель (Foo::static_func(&foo);).

При этом ваша функция выглядит так, как будто она не должна быть статической с самого начала. Сделайте это нестатичным.

0 голосов
/ 26 мая 2019

Если предположить, что подойдет любой экземпляр класса, почему статическая функция не может просто создать свой собственный временный экземпляр класса?Особенно, если есть конструктор по умолчанию.Например, приведенный ниже код компилируется правильно:

class Circle
{
public:
    Circle(double centerX, double centerY, double radius);
    Circle() : Circle(0.0, 0.0, 1.0)  // unit circle by default
    {}

    inline double  getRadius()  { return radius; };
    inline double  getArea()    { return area; };

    static  double computePi();   // HERE

private:
    double   centerX, centerY, radius, area;
};

Circle::Circle(double centerX, double centerY, double radius)
    : centerX(centerX), centerY(centerY), radius(radius)
{
    area = 3.14159*radius*radius;
}

double Circle::computePi()  // static class function, no "this" allowed
{
    Circle   tmpC1;  // temporary instance here !
    Circle*  tmpThis = &tmpC1;

    double  radius = tmpThis->getRadius();
    double  area   = tmpThis->getArea();
    double  pi     = area / (radius*radius);

    return pi;
}

ОК, семантика выглядит немного странной, но, возможно, она выглядит лучше в вашем собственном контексте.

...