在cpp的静态函数中访问这个指针

Posted

技术标签:

【中文标题】在cpp的静态函数中访问这个指针【英文标题】:Accessing this pointer in static function in cpp 【发布时间】:2019-05-26 06:16:04 【问题描述】:

我有一个 cpp 类和其中定义的几个方法。 其中一个静态方法需要调用同一个类的非静态方法。我不能使用“this”指针来执行此操作,因为不能使用静态函数“this”指针。

我需要以某种方式在 cpp 的静态方法中访问指向同一类的指针...有人可以帮忙

【问题讨论】:

“我需要在静态方法中访问指向同一类的指针” 您可以为static 类成员函数定义一个MyClass* 指针参数和把它传给那里。 你的意思是创建一个指向类的指针作为成员并传递给静态函数? 这毫无意义。您希望在特别声明为与没有此类实例相关联的函数体中可能修改哪个对象? 代码会说话很多,在这种情况下会澄清你真正想要做什么。 这个question 可能会有所帮助。 @andrew 因此,进行检查的方法需要类的实例才能执行检查。静态方法不需要类的实例来绘制。你知道这有多令人困惑吗?您需要更清楚地提出您的问题,才能得到好的答案。 【参考方案1】:

让静态函数获取类的引用参数。示例:

struct Foo 
    void func()  

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

用法:

Foo foo;
Foo::static_func(foo);

您可以改用Foo* obj 参数。在这种情况下,您显然需要传递一个指针 (Foo::static_func(&foo);)。

话虽如此,您的函数看起来不应该是静态的。使其成为非静态的。

【讨论】:

【参考方案2】:

假设类的任何实例都可以,为什么静态函数不能创建自己的临时类实例?特别是如果有默认构造函数。 例如,下面的代码编译正确:

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;

好的,语义看起来有点毛茸茸,但也许在你自己的上下文中看起来更好。

【讨论】:

以上是关于在cpp的静态函数中访问这个指针的主要内容,如果未能解决你的问题,请参考以下文章

关于类中静态成员函数和静态成员变量的知识点

将线程函数声明为静态函数的问题

访问静态成员函数中的非静态成员的解决方法

我可以举一个现实生活中的例子,其中非静态成员函数不访问通过空指针调用的对象会导致可观察到的问题吗? [复制]

C++ lib静态库的接口函数,可以返回一个指针吗?

C- 声明为静态的函数的链接