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

时间:2019-05-26 06:16:04

标签: c++ static this

我有一个cpp类,并且其中定义了一些方法。 静态方法之一需要调用同一类的非静态方法。我无法使用“ this”指针执行此操作,因为无法使用静态函数“ this”指针。

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

2 个答案:

答案 0 :(得分:1)

让静态函数接受类的引用参数。示例:

    .file   "test.c"
    .globl  top
    .bss
    .align 8
    .type   top, @object
    .size   top, 8
top:
    .zero   8
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    nop
    popq    %rbp
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size   main, .-main
    .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609"
    .section    .note.GNU-stack,"",@progbits

用法:

struct Foo {
    void func() { }

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

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

话虽这么说,您的函数似乎一开始就应该不是静态的。使其变为非静态。

答案 1 :(得分:0)

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

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;
}

好的,语义看起来有些毛茸茸,但在您自己的上下文中看起来可能更好。