у меня есть этот класс
class Dados
{
string name;
int valor;
public:
Dados(string n, int v) : name(n), valor(v){};
//~dados();
string GetName(){return name;}
int GetValor(){return valor;}
void SetValor(int x){valor = x;}
}
и этот класс, который в основном читает файл и помещает данные в вектор:
class FileReader{
vector<Dados> dados;
public:
bool ReadFile(string file) {
dados.empty();
string fnome, ftemp;
int fvalor;
ifstream fich(file);
string linha;if (fich.is_open())
{
while (fich.peek() != EOF){
getline(fich, linha);
istringstream iss(linha);
//cout << ".";
iss >> fnome;
iss >> ftemp;
iss >> fvalor;
dados.push_back(Dados(fnome,fvalor));
}fich.close();
return 0;
}
else{
cout << "Ficheiro \""<< file <<"\" nao encontrado!";
return 1;
}
}int FindOnVector(string fi)
{
int val;
vector<Dados>::const_iterator it;
it = dados.begin();
while (it != dados.end()){
val = it->GetValor();
it++;
}return val;
}
};
Но в классе FileReader мне нужно найти метод для поиска имени и возврата int (valor).
На этот раз он просто делает это возвращаемое значение. Не этот поиск имени.
но val = it->GetValor();
Дайте мне эту ошибку на VS 2012:
error C2662: 'Dados::GetValor' : cannot convert 'this' pointer from 'const Dados' to 'Dados &'
кто-нибудь может мне помочь?
Bests
Сделайте метод GetValor const:
`int GetValor() const {return valor;}`
Объявите геттер вот так, и он будет работать:
int GetValor() const {return valor;}
Ключевое слово const указывает, что вызов GetValor не изменяет объект.
Не относится к вашему вопросу, но это неправильно:
while (fich.peek() != EOF)
{
// ...
}
Вы должны просто иметь
while (std::getline(fich, linha))
{
// ...
}
На ваш первоначальный вопрос вам нужен метод get для имени с модификатором const:
string GetName() const
{
return name;
}
То же самое касается всех ваших получателей, если вы хотите использовать их в константных функциях / итераторах.
Прежде всего объявить эти функции как const
string GetName()const {return name;}
int GetValor() const {return valor;}
Во-вторых это утверждение в функции ReadFile
dados.empty();
не имеет никакого смысла. Он просто возвращает true, если вектор пуст. Я думаю ты имел ввиду
dados.clear();
Что касается поиска элемента вектора, то лучше использовать стандартный алгоритм std::find()
или же std::find_if
если вы будете использовать лямбда-выражение или стандартный предикат. Если вы будете использовать std::find
вам нужно определить оператор == для класса Dados.
Что касается вашей собственной функции, вы должны решить, что она будет возвращать в случае, когда ничего не было найдено. Предположим, вы вернете 0. Таким образом, функция может выглядеть следующим образом
int FindOnVector( const string &fi ) const
{
int val = 0;for ( const Dados &d : dados )
{
if ( d.GetName() == fi )
{
val = d.GetValor();
break;
}
}return val;
}