C ++ метод поиска не const? - PullRequest
       11

C ++ метод поиска не const?

4 голосов
/ 19 марта 2010

Я написал метод, который я хотел бы объявить как const, но компилятор жалуется. Я проследил и обнаружил, что эта часть метода вызывает трудности:

bool ClassA::MethodA(int x)
{
    bool y = false;
    if(find(myList.begin(), myList.end(), x) != myList.end())
    {
        y = true;
    }
    return y;
}

В методе происходит нечто большее, чем это, но, когда все остальное было удалено, эта часть не позволила этому методу быть постоянным. Почему алгоритм stl find не позволяет методу быть константным? Это как-то меняет список?

Ответы [ 4 ]

4 голосов
/ 19 марта 2010

Если myList является объектом пользовательского типа контейнера, у вас может возникнуть проблема, если его методы begin () и end () не имеют перегрузки const. Кроме того, предполагая, что, возможно, тип x не является целым в вашем коде, вы уверены, что есть оператор равенства, который может работать с константным членом этого типа?

2 голосов
/ 19 марта 2010

Я скопировал вашу реализацию, и у нее не было проблем:

class ClassA
{
    vector<int> myList;
public:
    bool MethodA(int x) const;
};

bool ClassA::MethodA(int x) const
{
    bool y = false;
    if (find(myList.begin(), myList.end(), x) != myList.end())
        y = true;

    return y;
}

Когда вы пытались сделать определение метода (то, что вы разместили выше) const, вы не забыли также изменить объявление метода?

0 голосов
/ 19 марта 2010

Опубликовать полную программу, которая не компилируется. Это хорошо компилируется:

#include <list>
#include <algorithm>
#include <iostream>

struct Foo {
    std::list<int> ml;
    bool search(int x) const {
        return std::find(ml.begin(), ml.end(), x) != ml.end();
    }
};

int main() {
    const Foo f;
    std::cout << f.search(0) << "\n";
}

Может быть, find не вызывает функцию, которую вы считаете [править: скорее всего, глупый я, myList не является std::list]. Сокращение до небольшой программы, которая демонстрирует проблему, вероятно, покажет причину, потому что в какой-то момент вы что-то удалите, и она начнет работать.

0 голосов
/ 19 марта 2010

отлично работает для меня (i686-apple-darwin10-g ++ - 4.2.1 (GCC) 4.2.1 (Apple Inc., сборка 5646)):

#include <list>
#include <algorithm>

class ClassA
{
public:
  ClassA() { myList.push_back(1); myList.push_back(2); }
  bool MethodA(int x) const;
private:
  std::list<int> myList;
};

bool ClassA::MethodA(int x) const
{
  bool y = false;
  if(find(myList.begin(), myList.end(), x) != myList.end())
    {
      y = true;
    }
  return y;
}

int main( int argc, char** argv )
{
  ClassA a;
  a.MethodA(5);
  return 0;
}
...