在非静态成员函数中无效使用此函数

时间:2014-12-20 19:02:45

标签: c++

我得到了以下课程:

class Foo {
private:
    static float scale;

public:
    static float setScale(float scale);
};

当我尝试像这样实现setScale时:

float Foo::setScale(float scale) {
   this->scale = scale;
   return scale;
}

它会抛出错误:

  

在非静态成员函数之外使用'this'无效。

我真的没有这个,因为我的功能被标记为静态。

我看到了一些相关的问题,但它没有回答我的问题。

那我怎么解决这个问题呢? 我知道我可以更改名称而不使用this但是可能有一个解决方案吗?

编辑:当我在类中实现该函数时,它仍然会抛出相同的错误。

3 个答案:

答案 0 :(得分:6)

static成员函数不属于该类。换句话说,它只有一个例子。请注意您如何使用范围解析运算符(Foo::setscale(1.f);)而不是成员引用运算符(Foo.setscale(1.f))来访问它们,因为它们不是类的实例的成员。

class Foo
{
public:
  void DoSomething();
};

在此示例中,如果我创建Foo f并调用f.DoSomething(),那么会发生的情况是编译器实际将DoSomething()转换为DoSomething(Foo* this),其中thisf地址static

但是,由于this成员函数不属于类,因此编译器不会将它们转换为接受static指针。

P.S。那么为什么{{1}} 成员有效?例如,您可以将函数的范围限制为声明它的类。

感谢您的阅读。

答案 1 :(得分:3)

this指针不在类的静态成员函数中。更改定义如下: -

float Foo::setScale(float s) {
   Foo::scale = s;
   return s;
}

答案 2 :(得分:3)

按以下方式更改功能定义

float Foo::setScale(float scale) {
   Foo::scale = scale;
}

静态成员函数没有隐式参数。

在第9.4.1节第2段第2段的注释中,C ++标准的静态成员函数有明确写入

  

2 [注意:静态成员函数没有this指针   (9.3.2)。 - 后注]

此外,您必须将函数定义为具有返回类型void,因为至少您没有从函数返回任何内容。

void Foo::setScale(float scale) {
   Foo::scale = scale;
}