2014-01-10 136 views
0

我有此類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 &' 

someon可以幫助我?

最好成績

回答

0

充分利用GetValor方法常量:

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

感謝您的幫助,解決了問題 –

0

聲明這樣的getter和它的工作:

int GetValor() const {return valor;} 

的const關鍵字表示調用GetValor不修改的對象。

0

不相關的問題,但這是錯誤的:

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

你應該只具有

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

要你原來的問題,你需要一個具有const修飾符的名稱的吸氣劑:

string GetName() const 
{ 
    return name; 
} 

如果你想在常量函數/迭代器中使用它們,所有你的getter也是一樣。

0

首先在功能上聲明這些函數爲const

string GetName()const {return name;} 
int GetValor() const {return valor;} 

其次這種說法的ReadFile

dados.empty(); 

沒有任何意義。如果矢量是空的,它只是返回true。我覺得你的意思

dados.clear(); 

至於搜索向量的元素,那麼最好是使用標準算法std::find()std::find_if如果你使用lambda表達式或一個標準謂詞。如果您將使用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; 
}