C ++ GetName вектор объектов

у меня есть этот класс

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

0

Решение

Сделайте метод GetValor const:

`int GetValor() const {return valor;}`
0

Другие решения

Объявите геттер вот так, и он будет работать:

int GetValor() const {return valor;}

Ключевое слово const указывает, что вызов GetValor не изменяет объект.

0

Не относится к вашему вопросу, но это неправильно:

while (fich.peek() != EOF)
{
// ...
}

Вы должны просто иметь

while (std::getline(fich, linha))
{
// ...
}

На ваш первоначальный вопрос вам нужен метод get для имени с модификатором const:

string GetName() const
{
return name;
}

То же самое касается всех ваших получателей, если вы хотите использовать их в константных функциях / итераторах.

0

Прежде всего объявить эти функции как 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;
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector