Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在非静态成员函数中对此的使用无效_C++ - Fatal编程技术网

C++ 在非静态成员函数中对此的使用无效

C++ 在非静态成员函数中对此的使用无效,c++,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”无效 void Foo::s

我上了以下课程:

class Foo {
private:
    static float scale;

public:
    static float setScale(float scale);
};
当我尝试像这样实现setScale时:

float Foo::setScale(float scale) {
   this->scale = scale;
   return scale;
}
它抛出一个错误:

在非静态成员函数之外使用“this”无效

void Foo::setScale(float scale) {
   Foo::scale = scale;
}
我真的不明白,因为我的函数被标记为static

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

那么我该如何解决这个问题呢? 我知道我可以更改名称,并且不使用
,但可能有解决方案吗


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

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

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

按以下方式更改函数定义

float Foo::setScale(float scale) {
   Foo::scale = scale;
}
静态成员函数没有此隐式参数

< >在9.4.1节中的C++第2节的注释中,C++标准中明确地写了

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

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

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

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

class-Foo
{
公众:
无效剂量();
};
在本例中,如果我创建一个
Foo f
并调用
f.DoSomething()
,发生的情况是编译器实际上将
DoSomething()
转换为
DoSomething(Foo*this)
其中
this
f
的地址

但是,由于
静态
成员函数不属于类,编译器不会将它们转换为包含该指针

另外,为什么有
静态
成员功能?首先,您可以将函数的作用域限制为声明它的类


感谢阅读。

是否应该将
setScale()
作为静态成员函数?静态成员函数是未绑定到特定实例的成员函数。在当前实例上设置数据成员的函数看起来与实际对象耦合,因此将其设置为静态与预期行为相矛盾。这同样适用于
比例
。问问自己,
scale
对于每个实例应该是不同的还是相同的。如果它应该是相同的,则将其设为静态的,否则不要。@broncoAbierto Function setScale声明为静态的。看原始帖子。哦,你是对的。我只看了变量。