如何解决这些错误:必须调用对非静态成员函数的引用,并且在静态成员函数中无效使用成员'mat'?

问题描述

我正在编写一个必须使用自定义排序的程序,所以我创建了一个自定义比较器“ comp”,但是在C ++类中使用它,给出了“ 必须调用对非静态成员函数的引用”,我使用静态布尔comp()修复了此问题。但是在将比较器函数设为静态后,出现错误在静态成员函数中无效使用成员'mat'”。我该怎么办?

我叫 sort(str.begin(),str.end(),comp()),而从“ comp” 中,我叫“ comp _()” 。我不得不以其他方式对字符串进行排序。

class Solution {
public:
     int mat[26][26];
       static bool comp_(char a,char b,int i) {
        if (i == 26) {
            return a<b;
        }
        if (mat[a-'A'][i] > mat[b-'A'][i]) {
            return true;
        }
        else if (mat[a-'A'][i] < mat[b-'A'][i]) {
            return false;
        }
        return comp_(a,b,i+1);
    }

      static bool comp(char a,char b) {
        return comp_(a,0);
    }


解决方法

技巧是在Solution类上定义一个调用操作符,以便可以将其用作传递给std::sort()调用的Comparator对象,如下所示:

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
     int mat[26][26];

     bool comp(char a,char b,int i) const {
        if (i == 26) {
            return a<b;
        }
        if (mat[a-'A'][i] > mat[b-'A'][i]) {
            return true;
        }
        else if (mat[a-'A'][i] < mat[b-'A'][i]) {
            return false;
        }
        return comp(a,b,i+1);
    }

    bool operator()(const char & a,const char & b) const
    {
       return comp(a,0);
    }
};

int main(int argc,char ** argv)
{
   std::vector<char> str;
   str.push_back('d');
   str.push_back('c');
   str.push_back('b');
   str.push_back('a');

   Solution sol;
   std::sort(str.begin(),str.end(),sol);

   for (size_t i=0; i<str.size(); i++) std::cout << str[i] << std::endl;
   return 0;
}

这样,Solution对象中的方法不必是静态的,因此它们可以访问mat成员变量。