我得到了以下课程:
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
但是可能有一个解决方案吗?
编辑:当我在类中实现该函数时,它仍然会抛出相同的错误。
答案 0 :(得分:6)
static
成员函数不属于该类。换句话说,它只有一个例子。请注意您如何使用范围解析运算符(Foo::setscale(1.f);
)而不是成员引用运算符(Foo.setscale(1.f)
)来访问它们,因为它们不是类的实例的成员。
class Foo
{
public:
void DoSomething();
};
在此示例中,如果我创建Foo f
并调用f.DoSomething()
,那么会发生的情况是编译器实际将DoSomething()
转换为DoSomething(Foo* this)
,其中this
是f
地址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;
}