reference to non-static member function must be called sort(numbers.begin(),numbers.end(),cmp);
做算法题的时候遇到的一个问题,和成员函数相关,这里记录一下备忘。
首先上代码:
class Solution {
public:
bool cmp(int a,int b)
{
string A = to_string(a) + to_string(b);
string B = to_string(b) + to_string(a);
return A < B;
}
string PrintMinNumber(vector<int> numbers) {
//关键是定制排序规则cmp
string result;
sort(numbers.begin(),numbers.end(),cmp);
for(int i = 0; i < numbers.size();i++)
{
result += to_string(numbers[i]);
}
return result;
}
};
问题出在sort(numbers.begin(),numbers.end(),cmp);这里,说你引用(调用)了非静态函数,但你不是通过类对象来调用的。问题的来源就是sort()函数的第三个谓词参数cmp。为什么会是这样的呢?
当我将cmp函数改为:
static bool cmp(int a,int b)
{
string A = to_string(a) + to_string(b);
string B = to_string(b) + to_string(a);
return A < B;
}
就没问题了。
实际原因是函数参数不匹配的原因。因为每一个普通的成员函数都有一个隐含的this指针参数。cmp作为sort()函数的谓词被调用时,传入的是两个参数,而作为类Solution的普通成员函数,实际上是:
bool cmp(Solution* this,int a,int b)
形参有三个参数。
这里复习一下普通成员和静态成员的区别。
静态成员属于类本身,不属于具体类对象,在类加载时分配内存空间,程序结束时才消失。可以类名直接访问。
普通成员属于类对象,在类对象创建时(类实例)才会分配内存,即动态加载内存,不用时消失。通过类对象去访问。
注:静态成员函数不能去访问普通成员,因为静态成员函数存在于普通成员之前,我们不能去访问一个内存中不存在的东西。
简单总结:
静态成员变量性质:
1.只能被初始化一次,下次执行该语句时自动跳过。
2.属于类,而非具体对象。
静态成员函数性质:
1.不包含指向具体对象的this指针;
2.不可以直接调用普通成员(可通过具体对象调用其对应的成员)。
3.类加载时分配内存空间属于类而非具体对象。