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

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

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

【问题讨论】:

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

标签: c++ static this


【解决方案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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多